어휘 캐스팅이 가능한 경우에만 템플릿에 지정된 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
에 대한 호출이 실패하고 특수한 템플릿이 실패하지 않는 경우에만 일치하는지 직접 확인하십시오.
필자는 함수 또는 연산자의 존재를 테스트하는 예제를 본 적이 있지만 주어진 형식의 템플릿 함수를 호출하면 오류가 발생하는지 테스트하지 마십시오.
추가 '구조체'에 요구 사항을 캡슐화 할 수 있습니다. 또한, 어떤 종류의 "오류"? 예외? 컴파일 타임 오류? – Xeo
lexical_cast()의 반환 유형이 lexical_cast 이 인스턴스화에 실패하더라도 모든 T에 대해 정의되어 있기 때문에 까다로운 작업입니다. 따라서 일반적인 트릭은 작동하지 않습니다. –
나는 컴파일 타임 오류를 잡을 수 있기를 희망한다. 요구 사항을'struct'에 캡슐화하면 코드를 정리하는 데 도움이되지만'lexical_cast' 구현에 대한 가정을하고있는 문제는 해결되지 않습니다. 나는 본이 맞다는 것을 두려워하고 내가하고 싶은 일은 불가능하다. – histumness