2009-10-27 4 views
4

다형성 타입을 사용하기 위해 boost :: any를 사용하고 있는데, 객체를 기본 유형으로 캐스팅 할 수 있어야합니다.boost :: any_cast (C++ 라이브러리)를 사용하여 기본 유형으로 변환하는 방법은 무엇입니까?

class A { 
    public: 
     int x; 
     virtual int foo()= 0; 
}; 

class B : public A { 
    public: 
     int foo() { 
      return x + 1; 
     } 
}; 


int main() { 
    B* bb = new B(); 
    boost::any any = bb; 
    bb->x = 44; 
    A* aa = boost::any_cast<A*>(any); 
} 

주요 기능의 코드는 실행시 다음과 같은 오류가 발생합니다 :

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >' 
    what(): boost::bad_any_cast: failed conversion using boost::any_cast 
Abort trap 

내가 부스트 ::이 작동하는 것 같다 reinterpret_cast에 대한 any_cast 코드에서 static_cast를 변경하는 경우. 그러나 나는 그 결과에 대해 확신하지 못한다.

의견이 있으십니까?

답변

7

C++에서 명시 적 캐스트를 필요로하지 않는 Upcasts (포인터를 기준으로).

반면에 boost::any_cast은 원래 저장된 정확히 동일한 유형으로 캐스팅 할 때만 성공합니다. (IIRC 당신이 올바른 유형에 액세스하려고하는지 확인 유형 ID를 사용하고, 유형 ID 비교는 정확히 일치하는 경우에만 해당.)

따라서 :

A* aa = boost::any_cast<B*>(any); 

을하지만, 다소 불분명하다 왜해야 다형성 유형에 boost::any을 사용하십시오. 특히 스마트 포인터가 아니며 저장된 객체를 삭제하지 않습니다. 스마트 포인터에 다형성 개체에 대한 포인터를 저장하는 것이 더 일반적입니다 (예 : boost::shared_ptr<A>

+0

값 별 저장 개체를 삭제하고 삭제). – Sergei