voi*_*ter 7 c++ templates c++11
假设如下:
template <typename T> void foo (T*); // #1
template <typename T> void foo (T); // #2
template <> void foo (int*); // #3
Run Code Online (Sandbox Code Playgroud)
当引入也具有重载的基本模板的显式特化时,在设计的重载解析期间不考虑特化.我理解这一点.
但是,鉴于我可以使#3成为非模板重载,然后考虑重载解析,为什么我仍然想要像上面那样做呢?上面说明的设置是否有一个有效的用例?我唯一能想到的是,如果您不依赖于模板类型推导,则无法使用非模板函数,因为<>
在调用它们时它们不会接受语法.
顺便说一下,我只回顾了C++ 03的规则.我不确定C++ 11是否/如何改变这些规则/行为.
基本上,我赞成专业化,以避免最不意外的原则。您希望允许显式或非显式调用函数,以支持在尽可能多的代码中使用......并且当显式实例化时,它的行为应该与未显式实例化时的行为相同。
以下模板函数是一个示例,说明您可能希望如何显式选择要调用的函数(尽管所有 3 个函数都采用相同的参数)。
template <typename T> void foo (T*){std::cout << 1 << std::endl;} // #1
template <typename T> void foo (T){std::cout << 2 << std::endl;} // #2
template <> void foo<int> (int* x){std::cout << 3 << std::endl;} // #3
//void foo (int*){std::cout << 3 << std::endl;} // #3
template <typename T>
void bar(void* x) {
foo<T>(reinterpret_cast<T*>(x));
foo<T*>(reinterpret_cast<T*>(x));
foo(reinterpret_cast<T*>(x));
}
int main()
{
cout << "Hello World" << endl;
bar<int>(NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果没有专门化,则输出 1,2,3(显式实例化调用与重载调用不同),而使用专门化,您将得到 3,2,3(显式实例化与隐式调用相同)。