zhiyinjixu

  博客园  :: 首页  ::  :: 联系 ::  :: 管理

非类型模板参数-- 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不再是一个指向内部对象了,而是一个外部链接。
















posted on 2011-11-14 15:10  zhiyinjixu  阅读(370)  评论(0)    收藏  举报