2013-11-21 57 views
0

我簡要地瀏覽了各種C++網站和教科書。但他們中沒有一個與我所尋找的東西有關。列表功能C++

我想要的是一個C++中可以包含int,string和int數組變量的列表。但在我花幾個小時玩一些代碼之前,我想知道是否有人知道這樣的事情是否真的存在?我沒有要求向我展示代碼,如果可能的話,我會嘗試一下,然後詢問我遇到的任何問題。

感謝

+0

你知道[C++標準容器](http://en.cppreference.com/w/cpp/container)嗎? –

+0

閱讀此:http://stackoverflow.com/questions/3559412/how-to-store-different-data-types-in-one-list-c – Eutherpy

+4

所以你想要一個容器,可以容納不同類型的對象在同一時間?或者一個可以容納不同類型對象的容器? – StoryTeller

回答

5

你最好打賭是boost::variant。請記住 - 我沒有告訴你這很容易。

使用將是簡單的:

typedef boost::variant<...my necessary types...> MyVariant; 

std::list<MyVariant> myList; 
+0

這可能並不容易,但會令人滿意。 – StoryTeller

+0

謝謝你會給它一個 – user3001499

+0

@ user3001499,考慮接受這個答案,如果建議的解決方案適合你。 – StoryTeller

2

如果你的意思是,它可以包含整型,字符串和數組作爲單獨的對象,而不是作爲一個(如工會)的對象 - 我想你應該在C++11 tuples 看一看,和在列表中使用它們。

+1

元組列表不是不同類型的對象列表......例如,包含一個int類型的「std :: tuple 和一個字符串,而不是一個int或一個字符串。 – Johan

+0

在列表中,還是替代列表? – doctorlove

+0

@Johan,是的,這是與,問題是關於使用int,字符串和數組。如果問題的作者意味着或者,當然元組不是答案 – Apokal

0

您還可以創建使用UNION或空指針的結構體。

enum varType 
{ 
    vt_int, 
    vt_float, 
    vt_string 
} 

class myVariant 
{ 
private: 
    void* mVariable; 
    varType mType; 
}; 

或也

class myVariant2 
{ 
private: 
    union 
    { 
     float fValue; 
     int iValue; 
     std::string* sValue;   
    }; 
    varType mType; 
} 

這不是很好的,需要鑄造嚴重,但如果你不喜歡使用其他庫這樣的小任務,這可能會有幫助。

編輯1:您將需要getStringValue,getFloatValue getIntValue函數。

Edit2:你可以安全地在std :: list中使用這個類。編輯3:你需要自己調用std :: string(如果變量是一個字符串)的析構函數。

+0

包含非pod成員的工會僅在C++ 11之後纔可用。 – StoryTeller

+1

@StoryTeller:它們是非平凡的(你需要自己調用析構函數) –

+0

然後聯合應該包括std :: string *或者甚至更糟,char *。所以我想用void *是一個更好的主意,並且更加靈活。 – holgac

0

將不同類型的對象/數據放在單個列表中可能是不安全的。

但是,如果它的要求,那麼爲什麼不從std :: list使用以上答案中提到的方法跟蹤類型被插入到列表中的組合來派生新類。

+1

我不願意給新來者一個贊成票,所以請刪除這個答案並在我之後重複:**不要從STL容器派生!不要從STL容器派生!不要從STL容器派生!**。 (長)理由是:1.在可行的情況下,你應該偏好組合繼承繼承,2.在不使用虛擬方法的情況下從類繼承沒有(功能)好處,3.繼承沒有「虛擬」析構函數和公共複製/移動構造函數是災難(截斷)的祕訣。 –