有很多方法可以解決不同成員的數據結構問題,最好的方法很大程度上取決於它將如何使用。
最明顯的是使用繼承。你獲得從基類的所有可能性:
struct base_struct {
int id;
std::string name;
};
list<base_struct*> some_list;
struct some_struct : public base_struct {
double metricA;
};
struct some_other_struct : public base_struct {
int metricB;
};
base_struct *s1 = new some_struct;
s1->id = 1;
// etc
base_struct *s2 = new some__other_struct;
s2->id = 2;
// etc
some_list.push_back(s1);
some_list.push_back(s2);
棘手的一點是,你必須確保當你回來的元素了,你的情況下適當。使用type_info
鑄造前
some_struct* ss = dynamic_cast<some_struct*>(some_list.front());
您可以查詢名稱:dynamic_cast
可以在一個類型安全的方式做到這一點
typeid(*some_list.front()).name();
注意,這兩種需要與RTTI,這通常是OK的建設,但並非總是如RTTI具有性能成本,並且可能膨脹你的內存佔用,特別是如果廣泛使用模板。
在之前的項目中,我們使用boost any來處理類似的事情。 any
的優點是它允許你混合不相互派生的類型。回想起來,我不確定我會再這樣做,因爲它使得代碼在運行時過於容易失敗,因爲類型檢查正在推遲到那時。 (這是dynamic_cast
的做法也是如此
在壞舊的C日子裏,我們解決了一個union
此相同的問題:同樣
struct base_struct {
int id;
std::string name;
union { // metricA and metricB share memory and only one is ever valid
double metricA;
int metricB;
};
};
,你有,你必須處理的問題確保它是你自己的正確類型
在STL之前的時代,許多容器系統被編寫爲採用void*
,同樣需要用戶知道什麼時候需要施放。理論上,你仍然可以通過說list<void*>
但您無法查詢該類型。
編輯:從來沒有,有史以來使用void*
方法!
我不清楚爲什麼「條目數」是一個問題,因爲列表不是固定的大小。 –
我只說過,因爲有人可能會推薦不使用列表並且只支持固定大小條目數的解決方案。 – user396404
假設您可以創建這樣的數據結構。你會做什麼?你能用C++來展示一些預期用法的例子 - 就像僞代碼一樣嗎? –