【问题标题】:Boost::any and polymorphismBoost::any 和多态性
【发布时间】:2009-07-06 18:59:43
【问题描述】:

我正在使用boost::any 来存储指针,我想知道是否有 一种提取多态数据类型的方法。

这是一个简单的例子,说明我理想情况下想做的,但目前不起作用。

struct A {};

struct B : A {};

int main() {

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

这失败了,因为 a 正在存储 B*,而我正在尝试提取 A*。有没有办法做到这一点?

谢谢。

【问题讨论】:

    标签: c++ polymorphism boost-any


    【解决方案1】:

    Boost.DynamicAny 是 Boost.Any 的变体,它提供了更灵活的底层类型动态转换。虽然从 Boost.Any 检索值要求您知道存储在 Any 中的确切类型,但 Boost.DynamicAny 允许您动态转换为所持有类型的基类或派生类。

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

    【讨论】:

    • 我刚刚开始使用它:它完全按照我的要求工作......并且不需要堆分配/新建,这将使我正在编写的 API 与用户的观点看法。谢谢!
    【解决方案2】:

    另一种方法是在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;
    }
    

    【讨论】:

      【解决方案3】:

      不幸的是,我认为唯一的方法是:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-23
        • 2017-11-02
        • 1970-01-01
        • 2023-03-18
        相关资源
        最近更新 更多