2012-01-12 2 views
4

어휘 캐스팅이 가능한 경우에만 템플릿에 지정된 std::string 매개 변수를 std::string 매개 변수를 캐스팅하기 위해 boost::lexical_cast을 사용할 메서드를 제공하기 위해 사용하고있는 템플릿 클래스가 있습니다. 현재 가능한지 확인하기 위해 해당 유형에 대해 operator>>이 정의되어 있는지 확인하기 만하면됩니다. 여기에 인위적인 예는 기본적으로 내가 뭘하는지 설명이다 :SFINAE를 사용하여 제공된 유형으로 인해 템플릿 기능에 대한 호출이 실패하는지 확인하는 방법이 있습니까?

template <typename ArgType, class Enable = void> 
MyHelperClass 
{ 
    void Foo (ArgType arg&, std::string strArg) { } // not castable; do nothing 
}; 

template <typename ArgType> 
MyHelperClass<ArgType, boost::enable_if<boost::has_right_shift<std::istream, ArgType> >::type> 
{ 
    void Foo (ArgType arg&, std::string strArg) { 
     arg = boost::lexical_cast<ArgType>(strArg); // cast string arg to ArgType 
    } 
}; 
지금까지 내 코드를 잘 작동

: 어휘 캐스트를 실패하는 유형의 모든 첫 번째 버전으로 끝낼와 다른 모든 종료 두 번째로, 적어도 내 코드가 이것을 사용하고있는 유형에 대해서. 내가 걱정하는 것은 기본적으로 대상 유형이 InputStreamable이고 lexical_cast가 실패하지 않는다는 가정을하고 있다는 것입니다. lexical_cast에 대한 boost documentation은 몇 가지 다른 요구 사항을 설명합니다. 복잡한 내용을 작성하기보다는 enable-if을 작성하고 mpl::and_ 문자열을 함께 사용하여 이러한 조건을 묶어 두는 것이 궁금합니다. SFINAE를 사용하여 테스트하는 방법이 있습니까? 주어진 타입에 대해 lexical_cast에 대한 호출이 실패하고 특수한 템플릿이 실패하지 않는 경우에만 일치하는지 직접 확인하십시오.

필자는 함수 또는 연산자의 존재를 테스트하는 예제를 본 적이 있지만 주어진 형식의 템플릿 함수를 호출하면 오류가 발생하는지 테스트하지 마십시오.

+0

추가 '구조체'에 요구 사항을 캡슐화 할 수 있습니다. 또한, 어떤 종류의 "오류"? 예외? 컴파일 타임 오류? – Xeo

+1

lexical_cast ()의 반환 유형이 lexical_cast 이 인스턴스화에 실패하더라도 모든 T에 대해 정의되어 있기 때문에 까다로운 작업입니다. 따라서 일반적인 트릭은 작동하지 않습니다. –

+0

나는 컴파일 타임 오류를 잡을 수 있기를 희망한다. 요구 사항을'struct'에 캡슐화하면 코드를 정리하는 데 도움이되지만'lexical_cast' 구현에 대한 가정을하고있는 문제는 해결되지 않습니다. 나는 본이 맞다는 것을 두려워하고 내가하고 싶은 일은 불가능하다. – histumness

답변

1

전 두렵습니다. lexical_cast는 모든 T에 대해 정의되었으므로 SFINAE는 도움이되지 않습니다. lexical_cast()의 본문이 특정 유형으로 컴파일되지 않으면 대체 오류가 발생하지 않습니다. 당신이 할 수있는 최선은 당신이 이미 해왔 던 것처럼 신체가 실패하게 할 조건을 예측하려고 노력하는 것입니다.

+0

나는 이것이 사실이라고 느끼고 있었지만, 나는 단지 확신하고 싶었다. 감사! – histumness

관련 문제