C ++模板专门化语法
在C ++ Primer Plus(2001,Czech Translation)中,我发现了这些不同的模板特化语法:
函数模板
template <typename T> void foo(T);
专业化语法
void foo(int param); // 1 void foo<int>(int param); // 2 template <> void foo<int>(int param); // 3 template <> void foo(int param); // 4 template void foo(int param); // 5
使用Googlesearch一下,我发现只有3号的例子。 其中有没有什么区别(通话,编译,使用)? 他们中的一些已经过时/弃用了吗? 为什么不使用1号?
这里有每个语法的注释:
void foo(int param); //not a specialization, it is an overload void foo<int>(int param); //ill-formed //this form always works template <> void foo<int>(int param); //explicit specialization //same as above, but works only if template argument deduction is possible! template <> void foo(int param); //explicit specialization //same as above, but works only if template argument deduction is possible! template void foo(int param); //explicit instantiation
由我添加:
//Notice <int>. This form always works! template void foo<int>(int param); //explicit instantiation //Notice <>. works only if template argument deduction is possible! template void foo<>(int param); //explicit instantiation
从编码的angular度来看,过载优于function模板专业化。
所以,不要专门的function模板:
- 为什么不专门function模板?
- 模板专业化和重载
并了解术语:
- 实例
- 显式实例化
- 专业化
- 明确的专业化
看到这个:
- 实例化与c ++模板专业化的区别
使用Visual Studio 2012,如果没有函数参数,它似乎有点不同:
template <typename T> T bar( ); //template int bar<int>( ) { return 0; } doesn't work template < > int bar<int>( ) { return 0; } //does work