【问题标题】:Specialize template for a set of values为一组值专门化模板
【发布时间】:2014-07-17 23:20:16
【问题描述】:

我可以专门化一个模板:

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) { ... }

圆括号 (int, double) 将代表一整套类型。

【问题讨论】:

  • T 是函数的返回类型。
  • 您可以使用std::enable_if 创建重载或使用标签调度。
  • 您应该使用 std::enable_if 和 type traits 来指定您希望由部分特化处理的类型的特征。请注意,没有任何其他方法来解决重载解析的返回类型会导致您遇到麻烦

标签: c++ templates


【解决方案1】:

为了方便起见,我会编写一个类型特征类(因为标准库中没有)来检查一个类型是否与类型列表中的一个相同:

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 一起使用来有条件地启用重载not 特化):

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() { /* ... */ }

不幸的是,如果在类型列表中找到T,则对f 的调用是不明确的。如果您确实需要两个重载,您可以通过对另一个重载执行相同的操作来解决此问题,只需将 enable_if 的条件反转(有效地执行“disable_if”)。

【讨论】:

  • @Jarod42 让我们假装我从来没有写过那个:)
  • 目前这对我来说有点太复杂了,我需要先阅读一些文献才能了解它在做什么。但是,如果模板是模板 并且现在我想将它用于多个值,它也会起作用吗?或者如果它是一个模板
猜你喜欢
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
相关资源
最近更新 更多