我何时需要在第二个<>中指定类型模板专业化?

时间:2013-07-09 06:31:23

标签: c++ templates template-specialization

我有一个基本模板:

template <class X> void f(X x) {}

现在我已经看到了两种专门化的方法:

template <> void f<>(int x) {}

或者:

template <> void f<int>(int x) {}

gcc会同时使用这两种变体,但不能同时使用两种变体。

这两个专业是否相同?我何时需要在第二个&lt;&gt;中指定类型什么时候专门模板?

2 个答案:

答案 0 :(得分:2)

这两个专业是相同的。 template<>始终专注于现有模板,而不是声明新签名。如果从特化参数类型中扣除可以确定<>内的内容,那么您可以省略该部分。 (如果有更多的模板重载,将这些事情排除在外可能是一个坏主意。可能不清楚哪个模板是专用的。)

顺便说一下,专业化功能通常是一个坏主意。重载决策将更喜欢非模板重载并有效隐藏您希望防止的特化。而不是结合重载和专业化机制,只需坚持超载。

答案 1 :(得分:2)

您的两个变体都执行相同的专业化。您还可以使用第三个变体

template <> void f(int x) {}

还将专门化X = int的函数模板。它相当于你的第二个版本。

f<>和普通f的变体依赖于模板参数推导,而f<int>变量明确指定模板参数。

当模板参数扣除不可能时,您可能需要明确指定<>中的类型。在其他情况下,您不必这样做。

例如,如果您的函数参数列表不依赖于模板参数X,那么您别无选择,只能明确指定模板参数

template <typename X> void bar() {}

template <> void bar<int>() {}

以上编译。但是如果用

替换专业化
template <> void bar<>() {} 

它将无法编译,因为编译器无法推断出模板参数。