2017-04-24 38 views
1

我目前正試圖在基類的向量中存儲<int, Derived>的多個地圖。在基類向量中存儲兒童地圖

實施例:

std::map<int, Derived_1 *> map_1 = smth; 
std::map<int, Derived_2 *> map_2 = smth_else; 

std::vector<std::map<int, Base *>> list; 

list.push_back(map_1); 
list.push_back(map_2); 

然而,當編譯我得到有派生地圖和基類之間沒有轉換中的誤差。

有沒有更好的(或簡單的工作)的方式來解決這個問題?提前致謝。

+0

即使'list [0]'是'std :: map ',你也可以執行'list [0] [0] = new Derived_2;'。 – molbdnilo

回答

3

不,沒有辦法直接實現它,因爲std::map<int, Base*>std::map<int, Derived_1*>是不同的類型。

最直接的解決方案是在每個地方都使用std::map<int, Base*>。另一個將是轉換功能,但它不那麼優雅,你會遭受性能處罰。

另一種選擇,雖然更有限,但將使用std::variant(如果使用C++ 17)或boost::variant來存儲所有可能的類型。與此相對應的是,你可能不得不處理訪客等等。

+0

在這裏問愚蠢的問題,但後來我不得不投入我的派生類型,每次我使用它,對吧? – SgtDroelf

+1

不幸的是。另一方面,如果您使用的是類層次結構,則可能是派生類實現(覆蓋)了基類的某些特定行爲,在這種情況下,您只需調用基類的虛函數。這被稱爲[多態性](http://www.cplusplus.com/doc/tutorial/polymorphism/)(可能你已經知道了,只是爲了清楚)。 – cbuchart

+0

另一方面,如果每個派生類具有不同的接口,那麼我會建議檢查您的設計(或使用變體)。 – cbuchart