2009-07-06 7 views
4

포인터를 저장하기 위해 boost::any을 사용하고 있습니다. 다형성 데이터 형식을 추출하는 방법이 있는지 궁금합니다.부스트 :: 임의 및 다형성

여기 내가 이상적으로하고 싶지만 현재 작동하지 않는 간단한 예가 나와 있습니다.

struct A {}; 

struct B : A {}; 

int main() { 

    boost::any a; 
    a = new B(); 
    boost::any_cast< A* >(a); 
} 

이것은 a가 B *를 저장하고 A *를 추출하려고하기 때문에 실패합니다. 이것을 달성 할 수있는 방법이 있습니까?

감사합니다.

답변

4

다른 방법은 boost::any에서 A* 다음 dynamic_cast 출력을 저장하는 것입니다. 예 :

int main() { 
    boost::any a = (A*)new A; 
    boost::any b = (A*)new B; 
    A *anObj = boost::any_cast<A*>(a); 
    B *anotherObj = dynamic_cast<B*>(anObj); // <- this is NULL 

    anObj = boost::any_cast<A*>(b); 
    anotherObj = dynamic_cast<B*>(anObj); // <- this one works! 

    return 0; 
} 
+0

여기서는 static_cast가 더 적합합니다. –

3

불행하게도, 나는 그것을 할 수있는 유일한 방법이 생각 :

static_cast<A*>(boost::any_cast<B*>(a)) 
7

Boost.DynamicAny는 기본 유형의보다 유연한 동적 캐스팅을 제공하는 Boost.Any의 vairant입니다. Boost.Any에서 값을 가져 오는 것은 Any에 저장된 정확한 유형을 알고 있어야합니다. Boost.DynamicAny를 사용하면 보류 된 유형의 기본 클래스 나 파생 클래스로 동적으로 캐스트 할 수 있습니다.

https://github.com/bytemaster/Boost.DynamicAny

+1

나는 이것을 사용하기 시작했다. 정확히 필자가 요구하는대로 작동하지만 ... heap allocation/new'ing이 필요하지 않기 때문에 필자가 작성한 API를 사용자의 관점에서 보면 매우 깨끗하게 만들 수있다. 감사! – andybuckley