2009-07-06 64 views
4

我正在使用boost::any來存儲指針,並想知道是否有 提取多態數據類型的方法。Boost :: any和多態性

下面是一個理想情況下我想要做的簡單示例,但目前不起作用。

struct A {}; 

struct B : A {}; 

int main() { 

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

這失敗了,因爲a正在存儲一個B *,並且我試圖提取一個A *。有沒有辦法做到這一點?

謝謝。

回答

4

另一種方式是存儲在boost::anyA*然後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; 
} 
+0

Zifre是對的,static_cast在這裏更合適。 – 2009-09-03 07:35:39

3

不幸的是,我認爲這樣做的唯一方法是這樣的:

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

Boost.DynamicAny是Boost.Any上的一個優勢,它提供了更靈活的底層類型的動態轉換。鑑於從Boost.Any中獲取值需要您知道存儲在Any中的確切類型,而Boost.DynamicAny允許您動態地將其轉換爲保留類型的基類或派生類。

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

+1

我剛開始使用它:它完全按照我的要求工作......並且不需要堆分配/新建,這將使我從用戶的角度來看非常乾淨的API。謝謝! – andybuckley 2012-08-09 13:50:21