2009-07-06 12 views
4

ポインタを格納するのにboost::anyを使用していて、多態性データ型を抽出する方法が であるかどうか疑問に思っていました。Boost :: any and polymorphism

ここでは理想的には私がやりたいことの単純な例ですが、現在は機能しません。

struct A {}; 

struct B : A {}; 

int main() { 

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

これは、aがB *を格納しているために失敗し、A *を抽出しようとしています。これを達成する方法はありますか?

ありがとうございました。

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

答えて

4

他の方法は、出力をboost::anyA*を格納し、dynamic_castすることです:

+0

ここではstatic_castが適切です。 –

3

残念ながら、私はそれを行うための唯一の方法はこれだと思います。次のようなものがあります。

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; 
} 
7

Boost.DynamicAnyは、基礎となるタイプのより柔軟な動的キャストを提供するBoost.Anyのvairantです。 Boost.Anyから値を取得するには、Anyに格納されている正確な型がわかっている必要がありますが、Boost.DynamicAnyでは、保持されている型のベースクラスまたは派生クラスのいずれかに動的にキャストできます。

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

+1

私はちょうどこれを使用し始めました:それは私が必要とするように正確に動作します...そして、ヒープ割り当て/ new'ingは必要ありません。これは私が書いているAPIをユーザの観点からきれいにするでしょう。ありがとう! – andybuckley

関連する問題