函数模板显式特化c ++

时间:2013-04-16 13:51:14

标签: c++ templates specialization explicit

我的书提到了两种明确专业化的方法:

template <> void Swap<int> (int &, int &);
template <> void Swap(int &, int&);

两者有什么区别?什么时候使用另一个?何时使用另一个?什么是&lt;&gt;在函数名后?

2 个答案:

答案 0 :(得分:3)

  

两者有什么区别?

没有区别

在第二种情况下,您要让编译器从专业化的签名中执行类型推导。因此,两种表单都为Swap<T>()声明了T = int的特化。

  

什么时候使用另一个?何时使用另一个?

根据您的意愿,当一种形式或另一种形式在可读性或易维护性方面满足您的要求时。

  

究竟是什么&lt;&gt;在函数名后?

当函数名之后出现时,它是指定模板参数的语法:

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 关键字之后的,它是引入(类或函数)模板特化的语法。

答案 1 :(得分:1)

第一个示例是显式专门化模板的真正方法,第二个示例只是第一种方式的快捷方式,因为编译器可以从函数签名中推断出类型本身。 结果相同,没有真正的区别。

<>用于将模板参数提供给模板化结构,在这种情况下,模板参数是操纵数据的类型,专门化用于类型int