我可以专门化一个模板:
template <class T> T f(T x){ ... }
template <> int f(T x) { ... }
据我所知,我不能专注于整套T?例如,对于几种数字类型,例如:
template <class T> T f(T x){ ... }
template <> (int, double) f(T x) { ... }
圆形的parantheses(int,double)将代表一整套类型。
答案 0 :(得分:2)
我为了方便而编写了一个类型特征类(因为标准库中没有一个)来检查类型是否与类型列表中的类型相同:
template<typename T, typename U, typename... Ts>
struct is_any_of : is_any_of<T,Ts...> { };
template<typename T, typename... Ts>
struct is_any_of<T,T, Ts...> : std::true_type { };
template<typename T, typename U>
struct is_any_of<T,U> : std::false_type { };
现在,您可以将其与enable_if
配合使用以条件启用重载(不专业化):
template <class T> T f() { /* ... */ }
// unlike normal functions, function templates can be overloaded on return types!
template<typename T>
std::enable_if<
is_any_of< T, int, double, float, short, std::complex<double> >::value,
T
>::type
f() { /* ... */ }
不幸的是,如果在类型列表中找到f
,则对T
的调用不明确。如果你确实需要两个重载,你可以通过对另一个重载执行相同的操作来解决这个问题,只有enable_if
的条件被反转(有效地执行&#34; disable_if&#34;)。