C++ 非类型参数的模版实参

今天看见 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]; //www.sctarena.com 


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; 

你可能感兴趣的:(C++ 非类型参数的模版实参)