我正面临着一种情况,我有一个std :: vector的boost :: shared_ptrs的基类.在我的程序过程中,我需要将共享指针存储在该向量中的派生类对象中,并且在稍后的程序中,需要检索这些共享指针.
以下代码说明了我的问题:
#include <iostream> #include <vector> using namespace std; #include <boost/make_shared.hpp> #include <boost/foreach.hpp> class Base { public: virtual ~Base() { } }; /******************************************/ typedef boost::shared_ptr< Base > BasePtr; /******************************************/ class Derived1 : public Base { public: void derived1_test() { cout << "derived1_test" << endl; } /******************************************/ int i1; }; /******************************************/ typedef boost::shared_ptr< Derived1 > Derived1Ptr; /******************************************/ class Derived2 : public Base { public: void derived2_test() { cout << "derived2_test" << endl; } /******************************************/ int i2; }; /******************************************/ typedef boost::shared_ptr< Derived2 > Derived2Ptr; /******************************************/ int main() { Derived1Ptr d1 = boost::make_shared< Derived1 >(); Derived2Ptr d2 = boost::make_shared< Derived2 >(); vector< BasePtr > v; v.push_back( d1 ); v.push_back( d2 ); BOOST_FOREACH(BasePtr bPtr,v) { try { Derived1& d11 = dynamic_cast< Derived1& >( *bPtr ); d11.derived1_test(); } catch (const std::bad_cast& e) { Derived2& d22 = dynamic_cast< Derived2& >( *bPtr ); d22.derived2_test(); } } return 0; }
在上面的代码中,如果我更改BOOST_FOREACH中的代码
Derived1& d11 = dynamic_cast< Derived1& >( *bPtr );
至
Derived1Ptr d11 = dynamic_cast< Derived1Ptr >( bPtr );
,我在VS2010上得到以下编译时错误
invalid target type for dynamic_cast target type must be a pointer or reference to a defined class
我的问题是我想使用boost :: shared_ptr不参考.其次,当对象引用是不同的类型(尝试使用共享指针,但是获得前面提到的编译器错误)时,我正在使用dynamic_cast将抛出一个std :: bad_cast异常.这显然很慢我想要能够使用更加面向性能的方法.我正在寻找的是任何解决方案,而不是使用dynamic_cast和异常处理.
欢迎任何关于代码或设计变更的建议.