http://m.blog.csdn.net/u012999985/article/details/50780311
关于模板的非类型形参,网上有很多内容,C++primer只有大概一页的阐述,但是都不够清晰详细。下面我尽可能从自己的角度去给大家描述一下非类型形参的相关细节。如果想进一步理解非类型形参以及模板内容可以阅读C++template这本书,在4.1节,8.3.3节,13.2节都有相关解释。
模板除了定义类型参数,我们还可以在模板定义非类型参数。
什么是非类型形参?顾名思义,就是表示一个固定类型的常量而不是一个类型。
先举一个简单的例子(模板类与模板函数都可以用非类型形参)
//例子1:
template<class T, int MAXSIZE>
class List {
private:
T elems[MAXSIZE];
public:
Print() {
cout<<"The maxsize of list is"<<MAXSIZE;
}
}
List<int,5> list;
list.Print(); //打印"The maxsize of list is 5"
这个固定类型是有局限的,只有整形,指针和引用才能作为非类型形参,而且绑定到该形参的实参必须是常量表达式,即编译期就能确认结果。
这里要强调一点,我们对于非类型形参的限定要分两个方面看
1.对模板形参的限定,即template<>里面的参数
2.对模板实参的限定,即实例化时<>里面的参数
下面逐个解释一下非类型形参的局限
1.浮点数不可以作为非类型形参,包括float,double。具体原因可能是历史因素,也许未来C++会支持浮点数。
2.类不可以作为非类型形参。
3.字符串不可以作为非类型形参
4.整形,可转化为整形的类型都可以作为形参,比如int,char,long,unsigned,bool,short(enum声明的内部数据可以作为实参传递给int,但是一般不能当形参)
5.指向对象或函数的指针与引用(左值引用)可以作为形参
下面解释一下非类型实参的局限
1.实参必须是编译时常量表达式,不能使用非const的局部变量,局部对象地址及动态对象
2.非Const的全局指针,全局对象,全局变量(下面可能有个特例)都不是常量表达式。
3.由于形参的已经做了限定,字符串,浮点型即使是常量表达式也不可以作为非类型实参
备注:常量表达式基本上是字面值以及const修饰的变量