使用类型谓词来执行重载决策?

时间:2015-10-04 12:20:28

标签: c++ c++14

在C ++ 14中,假设我有一组N互相排斥的bool constexpr变量模板的一个类型模板参数:

template<typename T> constexpr bool P1 = ...;
template<typename T> constexpr bool P2 = ...;
.
.
.
template<typename T> constexpr bool PN = ...;

通过互斥,我们的意思是对于任意两个不同的整数ij(在[1..N]中)和任何类型T,Pi<T> && Pj<T>都是假的。

我想定义一个参数的重载函数集,由N函数定义组成,这样一个带有类型T参数的函数调用表达式将选择ith函数{{1如果没有这样的Pi<T>

,则为true,否则将无法编译
Pi

实现这个的最简单方法是什么?

1 个答案:

答案 0 :(得分:6)

您可以使用SFINAE:

template <typename T>
std::enable_if_t<P1<T>>
f(const T&t) { defn1(); }

template <typename T>
std::enable_if_t<P2<T>>
f(const T&t) { defn2(); }

// ...

要求是,对于T类型,只有一个Pi<T>true