今天看见c++中关于类模版的定义有两种,首先,类模版的定义和声明都以关键字template开头,后面接上以逗号分隔的模版参数表(template parameter list),模版参数表以<>括起来,模版参数一种是类型参数(type parameter),另一种是非类型参数(nontype parameter)。关于类型参数模版不多说了,有关键字class或typename接上后面的标识符构成,例如template<class T> template <typename T>,对于非类型参数模版(nontype parameter)需要注意的是它由普通参数声明构成的,它代表类模版中的一个常量,例如定义template<int a,int b>,这之后就要注意了,给定的非类型参数的表达式必须是一个常量表达式,但是名字空间域的对象的地址可以被用作非类型模版参数的实参,因为名字空间域任何对象的地址是常量表达式(即使不是const定义的),而局部对象的地址不是。例如 template <int a >class A{}; template <int *ptr> class Ap{}; int size=11; const int size_ =12; 则以下的表达式都是可以的 :
A<11> a0;
A<size_> a1;
A<sizeof(size)> a2;
Ap<&size> b0;
值得注意的是,如果一个非类型参数模版的两个表达式的值结果相等,则认为是等价的模版实参,例如Screen<1+2+3,4> s1和Screen<6,2*2> s2认为是引用同一模版实例Screen<6,4>。
指出下面哪些模版的实例化是有效的?
template < int *ptr > class Ptr { ... };
template < class Type, int size > class Fixed_Array { ... };
template < int hi, int wid > class Screen { ... };
(a) const int size = 1024;
Ptr< &size > bp1;
(b) int arr[10];
Ptr< arr > bp2;
(c) Ptr < 0 > bp3;
(d) const int hi = 40;
const int wi = 80;
Screen< hi, wi+32 > sObj;
(e) const int size_val = 1024;
Fixed_Array< string, size_val > fa1;
(f) unsigned int fasize = 255;
Fixed_Array< int, fasize > fa2;
(g) const double db = 3.1415;
Fixed_Array< double, db > fa3;