Ограничение шаблона C ++ на наличие метода

Я хочу узнать, существует ли способ ограничения шаблонов таким образом, чтобы экземпляры имели определенный метод. Например, представьте себе универсальную функцию isLess, для которой требуется оператор< или оператор>. Есть ли способ контролировать это?

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

Когда мы используем это с классом, не имеющим оператора< это даст ошибку. Как я могу справиться с этим?

1

Решение

СФИНАЕ и 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; }
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]