首页 > C++入门教程 > C++模板与标准模板库
C++模板中的函数式参数
前面我们提到过,模板类至少有一个类参数,但是可以有多个参数,这些参数中可以存在非类类型的参数,例如系统内建的普通数据类型参数或程序自定义的数据类型参数,我们将这种非类类型的参数称之为函数式参数。
【例 1】
【例 2】
对于前面章节中创建的 array 模板类,我们需要以如下的方式定义对象:
在模板类实例化过程中,我们需要用具体的数据类型来代替类参数,用具体的数值来替换函数式参数,如此才能实例化成功。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
【例 1】
template< class T, int S, double R>
class test
{
//......
};
在本例中例举了函数式参数的用法,在模板头中,先是一个类参数 T,之后是两个函数式参数 S 和 R。【例 2】
#include <iostream>
using namespace std;
template< class T , int S>
class array
{
public:
array();
T & operator[]( int );
const T & operator[] ( int )const;
int getlen()const{ return length; }
~array();
private:
int length;
T * num;
};
template< class T , int S>
array<T, S>::array()
{
num = new T[S];
length = S;
}
template< class T , int S>
array<T, S>::~array()
{
delete[] num;
}
template< class T , int S>
T & array< T, S > ::operator[] (int i)
{
if( i < 0 || i >= length)
throw string( "out of bounds" );
return num[i];
}
template< class T , int S>
const T & array< T, S > ::operator[] ( int i ) const
{
if( i < 0 || i >= length)
throw string( "out of bounds" );
return num[i];
}
template< class T , int S>
ostream & operator<<( ostream & out, const array <T, S> & A)
{
for(int i=0; i < A.getlen(); i++)
out<< A[i] << " ";
return out;
}
int main()
{
array< int, 10> A;
for(int i = 0; i < 10; i++)
{
A[i] = 2*i;
}
cout<< A << endl;
return 0;
}
在本例中,我们将前面的 array 模板类进行了修改,使之有两个参数,一个是类参数 T,另一个是函数式参数 S。修改后的 array 模板类用默认构造函数替代了带参构造函数。因为在模板类中添加了一个函数式参数 S 以表示数组的大小,因此定义对象时无需再利用带参构造函数的参数来确定数组的大小。对于前面章节中创建的 array 模板类,我们需要以如下的方式定义对象:
array<int> A(100); array<string> S(10);修改后的 array,我们只需要按照如下方式定义对象:
array<int, 100> A; array<string, 10> S;修改后的 array 类的类名变为了
array<T, S>。对于修改后的 array 类,想要将其实例化则必须提供两个参数的实例,例如:
array<int, 100> A; array<double, 10> D;都是可以正确实例化并定义对象的,但是如果只提供一个参数则是不可以的,例如:
array<int> A; array<10> D;这两种情况都是错误的的实例化。
在模板类实例化过程中,我们需要用具体的数据类型来代替类参数,用具体的数值来替换函数式参数,如此才能实例化成功。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。