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

And*_*zos 2 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 = ...;
Run Code Online (Sandbox Code Playgroud)

通过互斥,我们的意思是对于任何两个不同的整数ij(in [1..N])以及任何类型T,Pi<T> && Pj<T>都是错误的.

我想定义一个由N函数定义组成的参数的重载函数集,这样一个带有类型为T的参数的函数调用表达式将选择ith函数if Pi<T>为true,否则如果不存在则无法编译Pi:

void f(T such that P1<T>) { defn1; }
void f(T such that P2<T>) { defn2; }
.
.
.
void f(T such that PN<T>) { defnN; }
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*d42 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(); }

// ...
Run Code Online (Sandbox Code Playgroud)

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