您的位置:首页 > 编程语言 > C语言/C++

《C++ primer》学习笔记之二十六:None-type template parameter

2006-04-14 01:37 591 查看
4.Nonetype template parameter:即不代表类型的模板参数。此参数和真正的函数参数很像。
template <class T, int size> //此处的size即为Nonetype template parameter
T* f()
{
T aryT[size]; //注意这句:只有编译期常量可以作数组定义的长度
for( int i = 0; i < size; i++ )
{
aryT[i] = T(i);
}

return aryT;
}

一般,Nonetype template parameter都提供一个编译期常量,此常量可以当作const值来用。
推导Nonetype template parameter的值得过程和普通的template_parameter类似。
像上面的函数定义,光靠函数调用没法推导出参数T 和 size的值,得显示调用:
f<int, 3>();

下面例子中靠数组的引用来推导出Nonetype parameter的值:
template <class T, int size>
T f(T (&rt)[size])
{
T sum = T(); //注意这句:只有编译期常量可以作数组定义的长度
for( int i = 0; i < size; i++ )
{
sum += rt[i];
}

return sum;
}

int ary[] = {1, 2, 3, 4};
cout << f(ary) << endl; //ok。 实例化:int f(int (&rt)[4])
数组的引用才可以,如果是数组的话,就不行了:
template <class T, int size>
T f(T t[size]) { ... }
因为数组作参数时是一个指针,所以无法推导出size的值。

注意:
(1)如果class/struct想作Nonetype template parameter,则必须用指针
template <T t> void f(){} //error
template <T *t> void f(){} //ok

(2)要用编译器常量去实例化Nonetype template parameter的值,普通定义的变量不行。
比如:
T t;
int main()
{
f<0>();
f<&t>(); //ok.全局变量的地址是个编译器常量

T t2;
f<&t2>(); //error.局部变量在栈中分配,不是编译器常量。
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐