簡體   English   中英

如何使用boost :: any_cast(c ++庫)轉換為基類型?

[英]how to use boost::any_cast (c++ library) to cast to base types?

我使用boost :: any來獲得多態類型,我需要能夠將一個對象轉換為它的基類型。

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);
}

main函數的代碼在運行時拋出以下錯誤:

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

如果我在boost :: any_cast代碼中為reinterpret_cast更改static_cast,它似乎可行。 但是我不確定這會帶來什么后果。

你有什么想法?

向上(朝向指針)不需要在C ++中進行顯式轉換。

另一方面, boost::any_cast只有在轉換為與最初存儲的完全相同的類型時才會成功。 (IIRC使用typeid來檢查您是否正在嘗試訪問正確的類型,而typeid比較僅適用於完全匹配。)

因此:

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

但是,有些人不清楚為什么你應該使用boost::any來實現多態類型。 特別是,它不是智能指針,不會刪除存儲的對象。 更常見的是在智能指針中存儲指向多態對象的指針,例如boost::shared_ptr<A>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM