2010-07-22 30 views

回答

6

請參閱boost :: any。

你可以使用std :: vector然後用它來添加異構類型。

實施例:

std::vector<boost::any> v; 
v.push_back(std::string("hello world")); 
v.push_back(42); 
+0

最後是學習boost庫的一個理由。 – user35467 2010-07-22 09:10:16

+4

如果你想進一步,看看boost :: variant。它更像是一個編譯時版本的boost :: any,具有編譯時檢查功能。 boost :: any或多或少是執行相同操作的動態方式,在運行時完成類型檢查。 – Scharron 2010-07-22 09:17:37

+2

是的,因爲任何人都不知道可能的類型,沒有辦法獲得存儲對象的類型。人們必須提前知道它的價值。隨着變體,變體會告訴你,這是一個很大的好處。 – 2010-07-22 10:29:38

0

僅當您從相同的基類派生對象並聲明基類的類型列表時。

+2

這是錯誤的 - 如果您聲明std :: list ,則不能將某些派生類型的對象存儲在該列表中。正如Naveen所說,你必須使用類似std :: list 的東西。其中一個原因是因爲派生類型可能有更多成員數據字段,因此不適合爲base_t實例保留的空間。 – Steve314 2010-07-22 09:16:52

+0

是的,當您想要將派生類對象添加到列表中時,將其轉換爲基類指針。 – user35467 2010-07-22 09:20:16

2

否,如果它們是不相關的對象。如果他們是相關的(即有一個公共基類),那麼你可以在列表中存儲基類指針(使用智能指針而不是原指針)。

2

從技術上講,您可以將void *指針存儲到列表中的對象,但通常不是一個好主意。最好使用一些「變體」類,如boost::anyQVariant(如果您使用的是Qt),它將包裹您的元素。