【发布时间】:2013-04-16 13:51:14
【问题描述】:
我的书提到了两种显式专业化的方法:
template <> void Swap<int> (int &, int &);
template <> void Swap(int &, int&);
两者有什么区别?什么时候用一个,什么时候用另一个?函数名后面的到底是什么?
【问题讨论】:
标签: c++ templates specialization explicit
我的书提到了两种显式专业化的方法:
template <> void Swap<int> (int &, int &);
template <> void Swap(int &, int&);
两者有什么区别?什么时候用一个,什么时候用另一个?函数名后面的到底是什么?
【问题讨论】:
标签: c++ templates specialization explicit
两者有什么区别?
没有区别。
在第二种情况下,您让编译器从特化的签名中执行类型推导。因此,两种形式都声明了 Swap<T>() 的特化 T = int。
什么时候用一个,什么时候用另一个?
由您自行决定,当一种或另一种在可读性或易维护性方面满足您的要求时。
函数名后面的到底是什么?
在函数名之后,就是指定模板参数的语法:
template<typename T = double, typename U = char>
void foo();
foo<int, bool>(); // Specifies explicit template arguments
foo<>(); // Use default template arguments
foo(); // Same as above, allowed for *function* templates only
当它出现在template关键字之后时,它是用于引入(类或函数)模板特化的语法。
【讨论】:
template <> void Swap( int a, char b)?
第一个示例是显式特化模板的真正方法,第二个示例只是第一种方法的快捷方式,因为编译器可以从函数签名中推断出类型本身。 结果是一样的,没有真正的区别。
<>用于将模板参数赋予模板化结构,在这种情况下,模板参数是被操作数据的类型,特化是int类型。
【讨论】: