2009-10-27 291 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 

如果我改变的static_cast在升压::对的reinterpret_cast似乎工作any_cast代码。但我不确定这会带来什么后果。

你有什么想法吗?

回答

7

向上指针(指向基指针)不需要在C++中进行明确的转换。

另一方面,boost::any_cast只有投射到原来存储的相同类型时才会成功。 (IIRC它使用的typeid检查您试图访问正确的类型,typeid的比较是唯一真正的完全匹配。)

因此:

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

但是,有些不清楚为什么你应该对于多态类型使用boost::any。特别是,它不是一个智能指针,不会删除存储的对象。更常见的是将指向多态对象的指针存储在智能指针中,例如boost::shared_ptr<A>

+0

按值存储任何对象并删除它 – Sergei 2017-09-10 10:07:05