2017-05-13 111 views
-5

我對C++很陌生。我讀過C++中的結構是在編譯時創建的,所以可能沒有辦法做動態結構。但也許有另一種容器類型,適合我的情況? 我想解析來自HDF5文件的數據並在C++中使用它們。所以我不知道編譯時的內容。如何動態創建C++結構體?

基本上我有3種類型(讓它成爲A,B,C)的對象,我希望能夠以類似於結構的方式存儲 - 這意味着通過HDF5文件提供的名稱訪問它。然而,我不知道在編譯時A,B或C類型的對象的數量。但是當解析HDF5文件時,我可以發現。在C++中是否有任何支持這個的容器,還是我必須編寫自己的?

+0

如果你真的只有三種類型('A','B','C'),那麼你就是過度複雜的問題。簡單地使用一個包含三個向量'A','B'和'C'的結構 – user463035818

+1

您所有的問題[將在這裏回答](http://stackoverflow.com/questions/388242/the-definitive- C-書指南和列表)。如果您對C++「相當陌生」,那麼您應該花時間學習它,而不是試圖在沒有很好地理解語言基礎的情況下執行中等複雜的任務。您所描述的任何東西都不僅僅是一箇中等複雜的任務,而是您首先需要了解C++。首先,選擇一些C++書籍,然後開始閱讀它。 –

+0

「*我讀過C++中的結構體是在編譯時創建的,因此可能沒有辦法做動態結構體*」我認爲這個語句甚至在C++中意味着什麼。 – juanchopanza

回答

3

要通過字符串訪問數據,您可以使用std::map<std::string, T>。 現在接下來的問題是什麼是T型? 正如您在編譯時知道您想要處理的類型,std::variant(或std :: any)是正確且類型安全的容器。 如果您沒有C++ 17,請查看boost :: variant。他們基本上是有標籤的工會。對於類型X一個簡單的非一般的實現,Y看起來是這樣的:

struct XY { 
    union { 
     X x; 
     Y y; 
    }; 
    bool isX; 
    XY(X const& x) :x{x}, isX{true} {} 
    XY(Y const& y) :y{y}, isX{false} {} 
}; 

有了這些數據結構,你可以檢查哪種類型的存儲和檢索。結合std :: map到std::map<std::string, XY>,您可以通過它的名稱來訪問它。