2012-12-21 51 views
1

如果我有三個類型的地圖和矢量:抽象的地圖和矢量的STL

map1<CString, int> 
map2<CString, int, std::function1> 
map3<some_wrapper_of_CString, int, std::function2> 

STL中有一個抽象的容器或寫我自己的抽象容器做多態的唯一目的的方式:

abstract_map = MAP1或MAP2或MAP3

我的類包含MAP1我不能修改,因爲它會崩潰的其他類,我在高校工作中使用。我想通過創建一個抽象的地圖包MAP1我可以通過微管相關蛋白和三無其他修改...

我希望這是有道理的.....

+1

您需要完整地說明地圖的實際類型以及鍵和值之間的關係(公共基礎,轉換運算符...)讓我們有機會理解你在嘗試什麼,以及爲什麼你認爲多態是解決方案。 –

+1

@MatthieuM。我編輯了這個問題 – djWann

+0

你還需要在仿函數上輸入erase?這就是'std :: function'已經存在的地方。兩個'std :: function'類型的類型有何不同?簽名應該是相同的。 – pmr

回答

3

不,沒有。當元素不能相互轉換時,它的目的是什麼?

你總是可以做到:

containera c; 
containerb c2(c.begin(), c.end()); 

將從一個所有元素轉換到另一個容器。

如果您實際上具有相同底層value_type的容器,則通常對容器類型的抽象是迭代器而不是抽象容器。

在您澄清,你只需要在仿函數類型類型擦除:

class X { 
    // constructor taking the full type 
    X(const std::map<CString, int, std::function<bool(CString, int)>& x) : my_map(x) {} 

    // constructor taking the default std::less 
    X(const std::map<CString, int>& x) : my_map(x.begin(), x.end(), std::less<CString>()) {} 

private: 
    std::map<CString, int, std::function<bool(CString, int)> my_map; 
}; 
+0

目的是用盡可能少的變化來修改類,以獲得使用不同類型地圖的靈活行爲 – djWann

+0

@djWann因此地圖中的T總是相同的? – pmr

+0

@djWann我添加了一個與現有客戶保持兼容性的變體。 – pmr

2

STL中有一個抽象的容器或一種寫作我自己的抽象容器的唯一目的是做多態的方法

在標準C++庫中,沒有。

模板和動態多態性混合不好。

+0

我可以寫我自己的嗎? – djWann

+0

@djWann:取決於你想要做什麼。 – NPE

2

不僅有在STL沒有抽象的容器:你永遠不應該從STL容器繼承,因爲它們不打算表現爲多態(例如,沒有虛擬析構函數)。所以你必須尋找一個不同的解決方案。

在這種情況下,您必須贊成組合繼承。你可以寫自己的抽象圖類,它包含一個std::map,如:

template<typename T> 
class BaseMap 
{ 
    // Whatever you need here 

private: 

    std::map<T> internalMap; 
} 

,然後根據需要從該類繼承:

template<typename T> 
class Map1 : public BaseMap<T> 
{ 
    // Specialise your class here 
} 

當然,BaseMap應該提供你所需要的接口您的地圖,因爲它不會繼承std::map界面。您可以在此處編寫任何您需要的虛擬,純虛擬或非虛擬方法。

雖然也許你首先要問自己的第一個問題是:你真的需要不同的地圖類嗎?而且,如果是這樣,你真的需要它們是多態嗎?

+0

BaseMap不應該有一個地圖實例。對於上述模式,基本接口類應該是抽象的。 – Yakk

+0

@Yakk爲什麼不呢?這取決於你在不同的地圖類上需要的是什麼。如果他們都可以使用相同的'std :: map',那麼正確的地方可能就是基類。 – Gorpik

+0

由於OP在某些地圖中使用了不同的排序...... – Yakk