C ++模板限制有一个方法

时间:2013-10-03 09:38:15

标签: c++ templates restriction

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

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

当我们将这个用于没有运算符的类时&lt;它会给出错误。我该如何处理?

1 个答案:

答案 0 :(得分: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; }