《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.局部变量在栈中分配,不是编译器常量。
}
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.局部变量在栈中分配,不是编译器常量。
}
相关文章推荐
- 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)'
- 《C++ primer》学习笔记之二十四:template function 的定义
- C++ templete: "class" vs "typename" in a template-parameter
- 《C++ primer》学习笔记之二十五:template function 的实例化
- c++无类型参数模板(non-type template parameter)
- Missing URI template variable 'employeeNumber' for method parameter of type String
- none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)'
- template non-type parameter 非类型参数
- C++: typename in a template template parameter
- error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned
- error C2665:'AfxBeginThread':none of the 2 overloads can convert parameter 1 from type 'unsigned int
- Nontype template parameter
- caffe 跑模型报错 Error parsing text-format caffe.NetParameter: 3707:25: Message type "caffe.LayerParamet
- Mybatis配置映射文件中parameterType的用法小结
- 处理错误TypeError: initial_value must be unicode or None, not str
- springboot启动报错 Cannot determine embedded database driver class for database type NONE
- SPListTemplateType 对象
- C++ - 非类型模板参数(nontype template parameters) 使用 及 代码
- No qualifying bean of type [org.springframework.data.mongodb.core.MongoTemplate]
- python查询数据库,打印查询结果过程中出现'NoneType' object is unsubscriptable