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

3 に答える 3

7

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

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

于 2011-03-04T04:50:03.893 に答える
4

もう 1 つの方法は、を格納しA*boost::anyから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;
}
于 2009-07-06T20:11:30.403 に答える
3

残念ながら、これを行う唯一の方法はこれだと思います:

static_cast<A*>(boost::any_cast<B*>(a))
于 2009-07-06T19:04:52.223 に答える