1
我想了解是否有限制模板的方法,以便實例具有特定的方法。例如,考慮一個通用的isLess函數,它需要運算符<或運算符>。有沒有辦法控制它?C++模板使用方法的限制
template <Class T>
bool isLess(T first,T second){ return first < second; }
當我們使用這與不具有操作<一類,它會給一個錯誤。我該如何處理它?
我想了解是否有限制模板的方法,以便實例具有特定的方法。例如,考慮一個通用的isLess函數,它需要運算符<或運算符>。有沒有辦法控制它?C++模板使用方法的限制
template <Class T>
bool isLess(T first,T second){ return first < second; }
當我們使用這與不具有操作<一類,它會給一個錯誤。我該如何處理它?
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; }
如果EXPR已經是一個替換失敗,則不需要免費的'enable_if
編譯器強加的限制:如果'T'沒有一個有效的'operator <',那麼代碼將不會被編譯(儘管這個錯誤對於解密來說可能不是微不足道的)。 – juanchopanza
除了不正確的'Class'標記,你基本上覆制'std :: less <>'。重新設計這個輪子似乎有點矯枉過正。 – WhozCraig