非类型模板参数-- Nontype template parameters
模板的参数不一定是要是类型,也可以是值,以下面的模板为例:
|
#include<iostream> usingnamespace std;
template <typename T> T add(const T &a, const T &b) { return a+b; }
void main() { cout << "5 add 10 is:" << add<>(5,10) << endl; } |
参数T表明了一个未知的类型,或者说T代表了一个类型。
模板参数也可以是一个值,当模板参数是一个值时,则T就代表一个确切的值。如下边这个模板,可以通过参数指定数组的大小:
|
template <typename T, int iArraySize> class coo { public: T arr[iArraySize]; }; |
当然,我们可以指定这个非类型参数的默认值,如:
|
template <typename T, int iArraySize=100> class coo {}; |
这里的iArraySize的默认值就是100。
这里要注意,对于函数模板,其实就是一个重载函数集,对于重载函数集,编译器是无法推导其模板参数类型的,需要显式指定类型,如下边的例子:
std::transform (source.begin(), source.end(), // 来源端起止位置
dest.begin(), // 目的端起始位置
(int(*)(int const*)) addValue<int,5>); // 操作
(int(*)(int const*))是函数指针的表示方法。
注意:
使用非类型模板参数时,只能是整型,包括enum,或者是指向外部链接对象的指针,如果这样:
template <float T>
则将无法通过编译。
在书中有这样一段话:
|
不允许浮点字面常数(floating-point literals)或简单的常量浮点表达式(constant floating-point expressions)作为 ,其实只是历史因素,并非技术原因。由于并没有什么实作 上的困难,或许将来C++会支持它,请参考 13.4 节。 |
另外,全局指针也不能拿来做模板参数。
有关“指向外部链接对象的指针”这句话如何理解?以下边的例子为例:
|
#include<iostream> usingnamespace std;
template <charconst* name> class MyClass {};
charconst s[] = "Hello";
void main() { MyClass<s> x; // 不可以,s是一个内部对象 } |
上面是不可以的,但可以这样:
extern char const* s[] = “Hello”;
因为加了extern关键字的s不再是一个指向内部对象了,而是一个外部链接。
浙公网安备 33010602011771号