2013-05-06 1 views
3

어떻게 static_assert 템플릿 유형은 C++ 11의 EqualityComparable 개념입니까?평등 비교 형에 대한 C++ 11 정적 어설 션?

#include <type_traits> 

template<typename T, typename = void> 
struct is_equality_comparable : std::false_type 
{ }; 

template<typename T> 
struct is_equality_comparable<T, 
    typename std::enable_if< 
     true, 
     decltype(std::declval<T&>() == std::declval<T&>(), (void)0) 
     >::type 
    > : std::true_type 
{ 
}; 

이 방법을 테스트 할 것 : 여기

struct X { }; 
struct Y { }; 

bool operator == (X const&, X const&) { return true; } 

int main() 
{ 
    static_assert(is_equality_comparable<int>::value, "!"); // Does not fire 
    static_assert(is_equality_comparable<X>::value, "!"); // Does not fire 
    static_assert(is_equality_comparable<Y>::value, "!"); // Fires! 
} 

live example입니다

+2

템플릿 유형 인수에 'static_assert'가 때로는 차선책이라고 생각합니다. 'static_assert' 함수는 컴파일 실패 대신에 SFINAE를 필요로합니다. – Yakk

답변

14

당신은 다음과 같은 유형의 특성을 사용할 수 있습니다.

+1

사소한 수정 : T가 기본 구성 가능하지 않은 경우 제대로 작동하지 않습니다. -'T()'대신'std :: declval ()'으로 만드십시오. – jrok

+0

@jrok : 물론입니다. 어떻게 그걸 간과 할 수 있는지 모르겠다. 감사합니다 –

+0

엄밀히 말하면, Commutativity 및 Transitivity reqs는 확인되지 않았기 때문에 100 % EqualityComparable 개념 검사가 아닙니다. 그러나 컴파일 시간에 검사 할 수 없기 때문에별로 중요하지 않습니다. – Rost