1

インスタンスが特定のメソッドを持つようにテンプレートを制限する方法があるかどうかを知りたいです。たとえば、operator< または operator> を必要とする一般的な isLess 関数を考えてみましょう。それを制御する方法はありますか?

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

operator< を持たないクラスでこれを使用すると、エラーが発生します。どうすれば対処できますか?

4

1 に答える 1

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; }
于 2013-10-03T09:44:53.807 に答える