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

相關問題