专门化一组值的模板

时间:2014-07-17 14:15:48

标签: c++ templates

我可以专门化一个模板:

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)将代表一整套类型。

1 个答案:

答案 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;)。