在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)
通过互斥,我们的意思是对于任何两个不同的整数i和j(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)
实现这个的最简单方法是什么?
您可以使用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.