2015-10-04 39 views
2

在C++ 14,假设我有一组的一种类型的模板的参数N互斥布尔变量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功能如果Pi<T>为真,或将无法被编译,如果有没有这样的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; } 

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

回答

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