C++模板-专门化函数
C++ Templates - specializing functions
我有以下代码:
//1
template<typename T>
void c(T in) {
cout << "Template c(" << in << ")" << endl;
}
//2
template<>
void c<>(int* in) {
cout << "Template specialization b(" << in << ")" <<endl;
}
//3
template<typename T>
void c(T* in) {
cout << "Template for pointers c(" << in << ")" <<endl;
}
//..
int i = 8;
c(&i);
有人能解释一下为什么在下面的例子中编译器选择函数#3,但当我改变函数#2和#3的顺序时,编译器选择函数#2吗?
编译器首先选择主模板,然后才确定使用哪个专业化。也就是说,在您的情况下,编译器总是选择第二个主模板,即#3。
然而,由于您在专门化函数模板时没有指定模板参数,因此您的专门化会根据其位置专门化不同的主模板:对于给定的顺序,它专门化第一个主模板,当您交换#2和#3的顺序时,它专门处理第二个主模板。在14.7.3[温度解释规范]第7段中,标准必须说明以下关于的情况
写专业文章时,要注意它的位置;或者把它编纂成一本书,这将是一场自焚的考验。
如果您想控制专业化实际专门化的主模板,您可以在专业化中指定模板参数:
template <> void c<int*>(int* in) { ... } // specializes the first primary
template <> void c<int>(int* in) { ... } // specializes the second primary
相关文章:
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 专门化模板覆盖函数/避免对象切片
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 如何在编译时专门化大型模板函数中的小部分
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 为模板函数专门化一个模板类
- 基于参数值的c++模板成员函数专门化
- 如何确定函数专门化的主模板
- 等价参数的c++函数专门化
- 基于运行时值调用不同的模板函数专门化
- 跨库的模板函数专门化符号匹配
- 模板函数专门化,c++
- 如何使用type_traits或模板函数专门化来整合模板方法
- 如何在子类中重载模板化函数(专门化)
- 可变模板函数:专门化头/尾和空基准情况
- 不允许void的部分函数专门化-替代解决方案