2013-10-03 39 views
1

我想了解是否有限制模板的方法,以便实例具有特定的方法。例如,考虑一个通用的isLess函数,它需要运算符<或运算符>。有没有办法控制它?C++模板使用方法的限制

template <Class T> 
bool isLess(T first,T second){ return first < second; } 

当我们使用这与不具有操作<一类,它会给一个错误。我该如何处理它?

+1

编译器强加的限制:如果'T'没有一个有效的'operator <',那么代码将不会被编译(尽管这个错误对于解密来说可能不是微不足道的)。 – juanchopanza

+0

除了不正确的'Class'标记,你基本上复制'std :: less <>'。重新设计这个轮子似乎有点矫枉过正。 – WhozCraig

回答

2

SFINAE和std::enable_if可以帮助您:

// enabled only if first<second is valid 
template <class T> 
auto isLess(T first,T second) 
-> typename std::enable_if< (sizeof(first<second)>0), bool>::type 
{ return first < second; } 

,或者允许反向以及使用

template< class T, class = void > 
struct has_less_than 
    : std::false_type {}; 

template< class T > 
struct has_less_than< T, typename std::enable_if< (sizeof(
    std::declval<T>() < std::declval<T>() // the expression to test 
)>0) >::type > 
    : std::true_type {}; 

,并使用它像这样

template <class T> 
typename std::enable_if< has_less_than<T>::value, bool>::type 
isLess(T first,T second) { return first < second; } 

template <class T> 
typename std::enable_if< !has_less_than<T>::value, bool>::type 
isLess(T first,T second) { return second > first; } 
+0

如果EXPR已经是一个替换失败,则不需要免费的'enable_if '。对于第一个例子,使用'template ()())> bool isLess(...){...}'。 – DanielKO