我有一个基本模板:
template <class X> void f(X x) {}
现在我已经看到了两种专门化的方法:
template <> void f<>(int x) {}
或者:
template <> void f<int>(int x) {}
gcc会同时使用这两种变体,但不能同时使用两种变体。
这两个专业是否相同?我何时需要在第二个&lt;&gt;中指定类型什么时候专门模板?
答案 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<>() {}
它将无法编译,因为编译器无法推断出模板参数。