2016-09-13 4 views
1

그래서 내가 bool에있는 변환 연산자가있는 유형에 대한 작업을 제한하기 위해 노력하고있어 ++ 11 static_assert 및 macro-ish C++ 98 정적 어설 션.삭제 기능

개인적으로 사용하거나 C++ 11에서 삭제하는 것을 시도하는 사용자에게 다소 유용한 메시지를 오류로 남기고 싶습니다.

이것은 msvc와 g ++/clang의 차이로 인해 MSVC에서만 작동합니다. g ++/clang과 정적 어설 션은 항상 발생합니다. "삭제 된"기능이 사용되지 않는 경우에도 마찬가지입니다. 내가 처음이를 보았다

template<typename R> 
STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& 
operator&&(const R&); 

:이 같은 -

트릭을 할 것입니다 내가 본 유일한 점은 템플릿의 반환 형식으로 메시지와 같은 이름의와 정의되지 않은 형식을 사용하는 것입니다 here

C++ 98에서이 작업을 수행하는 다른 방법이 있습니까? 사용자가이 기능을 사용하려고 시도하면 사용자 지정 메시지가있는 삭제 된 기능이 있습니까?

+0

@ 한스 파산 트 감사합니다. (이것에 관한 [> this <] (http://stackoverflow.com/questions/39479163) question) – onqtam

답변

1

static_assert(false, message), false은 템플릿에 종속적이지 않습니다.

템플릿에 따라 조건을 만들어야합니다.

static_assert(!std::is_same<T, T>::value, message)

+0

고마워! 실제로 나는 똑같은 것을 깨닫고 내 자신의 해결책을 생각해 냈다. - 템플릿 " struct deferred_false {static const bool value = false; };'''그리고'''deferred_false :: value'''를 정적 assert에 전달합니다! – onqtam