2016-08-08 7 views
4

C 스타일 캐스트는 C++에서 악의적 인 것으로 알려져 있습니다. 따라서 프로그래머가 의도 한 변환 클래스 만 허용 할 수 있도록 더 많은 맞춤 제작을 제공하기 위해 const_cast<>, static_cast<>dynamic_cast<>으로 대체됩니다. 여태까지는 그런대로 잘됐다.상영 전용 캐스트

그러나 명시 적 업 캐스트를 수행하는 기본 구문이없는 것으로 보입니다. A는을 허용하지 않고 Base& baseRef = derived 명시 적으로 에서 암시 적 변환을 수행하는 것을 의미합니다.

아주 작지만 (대부분의 경우 암시 적 변환이 잘 작동 함) 나는 알고 있지만 사용자 코드에 이러한 캐스트를 구현하는 데 사용할 수있는 기술이 무엇인지 궁금합니다. 나는 좋은 너무 복잡한 것 같습니다 그러나

template<class T> 
class upcast { 
    public: 
     template<class U, typename = typename std::enable_if<std::is_convertible<U, T>::value>::type> 
     upcast(U value) : value(value) {} 
     operator T() { return value; } 
    private: 
     T value; 
}; 

의 라인을 따라 뭔가에 대해 생각했다, 나는 템플릿 메타 프로그래밍의 전문가가 아니에요 이후, 나는 다른이 있는지 묻고 싶다/더 나은/더 간단한 접근법.

+2

난 당신이 여기에 달성하려는 모르겠어요. static_cast를 사용하여 업 캐스팅 할 수 있습니다. –

+0

'reference '는'null'이 아니기 때문에'reference'를'dynamic_cast' 또는 다른 캐스트로 업 캐스팅 할 수 없습니다. 따라서 업 캐스팅이 유효한지 알 수있는 방법이 없습니다. – LibertyPaul

+2

@LibertyPaul 무슨 뜻인지 잘 모르겠습니다. 'dynamic_cast'를 통한 업 캐스팅은 항상 성공하고 잘못된 다운 캐스트는 참조를 사용할 때'std :: bad_cast'를 던집니다. – TartanLlama

답변

2

std::forward<T&>은 업 캐스팅을 허용합니다 :

struct A {}; 
struct B : A {}; 
A a; 
B b; 
auto& x = std::forward<A&>(b); // OK 
auto& y = std::forward<B&>(a); // fails 
auto* px = std::forward<A*>(&b); // OK 
auto* py = std::forward<B*>(&a); // fails