2014-11-13 4 views
1

템플릿을 사용하여 C++ 유형에 대한 제약 조건을 작성했습니다. 이제 테스트 스위트에서 테스트 해보고, 동작이 멈출 때를 알아 봅니다.C++ : 제약 조건을 검사하기 위해 컴파일 오류를 테스트하는 방법

Field 클래스를 생각해보십시오. enable_if 조건이 실패하기 때문에

template <size_t Size> 
class Field { 
    template<size_t Offset, size_t Count> 
    Field<Count> SubString(typename std::enable_if<(Size >= Offset + Count)>::type* = 0) const { 
    return Field<Count>(data_.substr(Offset, Count)); 
    } 
} 

Field<5>("abcde").SubString<3,4>()

는 컴파일되지 않습니다. 나는 그것을 확인하는 방법을 찾고있다.

실제로 식을 컴파일하고 반환 값을 확인하는 스크립트를 작성했지만 C++로 완성하는 것을 선호합니다. 컴파일러는 g++ (GCC) 4.8.3 20140911입니다. 컴파일러에 의존하는 메소드는 환영합니다.

+1

[this] (http://coliru.stacked-crooked.com/a/525219183e8017cb)와 유사합니까? –

+0

예. 좋은 기술. 'void()'는 무엇을위한 것인가? 꼭 필요한 것은 아닙니다. – 12651654123zzz

+0

중간에있는'void()'? 'SubString'에서 리턴 된 타입과'true_type'을 취하는 것에 대한'operator '의 과부하가 결과를 엉망으로 만들지 않도록해야합니다. 두 개의 타입을 분리하여 상호 작용하지 않도록합니다. –

답변

1

내가 어떤 컴파일러를 사용하여이 작업을 수행 할 수있는 범용 방법을 잘 모르는 것 같아요

"C++로 작성하는 것을 선호합니다." 매우 구체적인 예를 들어 뭔가를 해킹 할 수 있습니다. enable_if가 실패 할 때 일치하는 오버로드가 SubString이고 반환 된 유형의 크기에 대해 정적 어설 션이 발생합니다.

그러나 더 복잡한 테스트의 경우, 다양한 데이터로 다양한 C++ 프로그램을 컴파일하고 실행하는 "시스템"테스트를하는 것이 일반적입니다. 때로는 정상적으로 종료되도록 보장하고, 컴파일 할 수없는 다른 시간을 보장합니다. IMHO, 당신은 더 유용하고 유연한 장기적으로 증명할 수 있기 때문에, 특정 테스트를위한 복잡하지 않은 해커보다는 오히려이 작업을 시작할 수도 있습니다.