2014-12-12 2 views
1

템플릿 기반 명시 적 캐스트 연산자를 시도하고 있습니다. 나는 표기법으로 연산자의 "이름"슬롯에 타입 특성과 std::enable_if이라는 표현식을 실제로 넣을 수 있음을 알았습니다.명시적인 템플릿 캐스트 연산자의 enable_if가 "invalid static_cast"를 제공합니다.

#include <iostream> 
#include <type_traits> 

class WillCast { 
public: 
    explicit operator int() { 
     return 1020; 
    } 
}; 

class WontCast { 
public: 
    template <typename T> 
    typename std::enable_if< 
     std::is_same<T, int>::value, int 
    >::type toInteger() 
    { 
     return 1324; 
    } 

    template <typename T> 
    explicit operator typename std::enable_if< 
     std::is_same<T, int>::value, int 
    >::type() 
    { 
     return 304; 
    } 
}; 

int main() { 
    std::cout << static_cast<int>(WillCast{}) << "\n"; // ok 
    std::cout << WontCast{}.toInteger<int>() << "\n"; // ok 
    /* std::cout << static_cast<int>(WontCast{}); */  // error 
}; 

GCC 4.8.2에서 돌아 오는 오류는 다음과 같습니다 :하지만 다음 테스트는 원하는 동작을 제공하지 않습니다

test.cpp: In function ‘int main()’: 
test.cpp:27:45: error: invalid static_cast from type ‘WontCast’ to type ‘int’ 
    std::cout << static_cast<int>(WontCast{}); 

난 할 노력하고있어 불가능했던 경우에, 나는 놀라지 않을 것이다. 그러나 구문이 괜찮다고 생각하는 것 같습니다. WontCast::toInteger()WillCast::operator int()에 의해 나타나는 "근처"동작간에 일관되게 동작하는 것처럼 보이지 않습니다.

(이것은 물론 내 enable_if이 까다 롭습니다 원하는 감소 된 예입니다.)


UPDATE - "사이드 바 인텔리전스 (TM)는"How can I use std::enable_if in a conversion operator?을 던졌다 내가 찾을 수 없습니다 "예전의 유익한 지능 (tm)"을 통해 나는 그것이 도움이되는지보고 볼 것이다. 음, WontCast가 템플릿 클래스가 아니기 때문에 거기에 사용 된 솔루션이 적용되지 않는 것 같습니다. 그래서 여기 돕는 게 아닙니다. 템플릿에 enable_if 부분을 이동하면

+0

무엇에 대한 [전문] (http://coliru.stacked-crooked.com/a/3f860354bf54a365)? –

+0

@remyabel 그 특별한 경우에는 작동하지만, 그 특정 사례가 내가 찾고있는 것이라면 WillCast와 함께 가서 "int"라고 말할 수 있습니다. 패턴 매칭을 수행하고 많은 캐스팅 연산자를 생성하는 무언가를 찾고 있습니다 ...하지만 올바른 경우에만 발생합니다. – HostileFork

+0

[this] (http://coliru.stacked-crooked.com/a/104248a4014efff6) 어때요? 질문에있는 링크와 동일한 트릭을 사용합니다. –

답변

3

이 작동 :

template <typename T, 
      typename = typename std::enable_if<std::is_same<T, int>::value>::type 
      > 
explicit operator T() 
{ 
    return 304; 
} 

주어진 :

int i = static_cast<int>(WontCast{}); // ok 
double d = static_cast<double>(WontCast{}); // invalid static_cast 
+0

이 방법으로 작업하면 실제로 작동합니다 ... 감사합니다! – HostileFork