我想了解是否有办法限制模板,使实例具有特定的方法。例如,考虑一个需要 operator< 或 operator> 的通用 isLess 函数。有没有办法控制它?
template <Class T>
bool isLess(T first,T second){ return first < second; }
当我们将它与没有 operator< 的类一起使用时,它会出错。我该如何处理?
我想了解是否有办法限制模板,使实例具有特定的方法。例如,考虑一个需要 operator< 或 operator> 的通用 isLess 函数。有没有办法控制它?
template <Class T>
bool isLess(T first,T second){ return first < second; }
当我们将它与没有 operator< 的类一起使用时,它会出错。我该如何处理?
SFINAEstd::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; }