2014-10-16 165 views
0

我有一個模板,它可能與不同的stl映射(map<int, int>,map<int, char>等)一起使用,如下所示。模板類在C++中的容器

template <typename Map> struct TriMaps 
{ 
    Map& next; 
    Map& prev; 
    Map& curr; 
}; 

所以,TriMaps<init, int> intTriMaps;TriMaps<int, char> charTriMaps;

然後,是有可能有上述TriMaps的容器,在不同類型?例如

vector <TriMaps> vecMaps; 

哪些包含intTriMaps和charTriMaps?通常容器需要相同的類型。但我真的需要一個容器來處理我的情況。沒有提升或第三個圖書館可用。

+1

是的。您需要指定'TriMaps'的參數類型,例如'vector > vecMaps;' – jrok 2014-10-16 12:05:32

+0

是,但是具體實例化(例如'TriMaps >') – Nim 2014-10-16 12:05:40

+0

@jrok,'TriMaps'正在期待只有一個類型的參數。你舉兩個例子。 – Ajay 2014-10-16 12:09:18

回答

1

首先確定並確定此類模板TriMaps預計要執行的操作。在C++中,您必須初始化某個引用。您可能需要一個非引用類型(或指針類型)。試想一下:

template <typename Map> 
struct TriMaps 
{ 
    Map next; 
    Map prev; 
    Map curr; 
}; 

用法:

TriMaps<int> IntMaps; 
vector<TriMaps<int>> iv; 

如果您需要兩個模板類型參數,你可以這樣說:

template <typename MapType1, typename MapType2> 
struct TriMaps 
{ 
    MapType1 a; 
    Maptype2 b; 
}; 

用法:

TriMaps<int, float> IntMaps; 
vector<TriMaps<int, float>> iv; 

編輯:

仔細瞭解下面的簡單類不會編譯。

class TriMap 
{ 
    int & ref_int; 
}; 

一種方法是指一個全局變量(這只是爲了編譯),或者通過一個構造採取int&

// Approach 1 
int global; 
class TriMap 
{ 
    int & ref_int; 
public: 
    TriMap() : ref_int(global) {} 
}; 

// Approach 2 
class TriMap 
{ 
    int & ref_int; 
public: 
    TriMap(int & outer) : ref_int(outer) {} 
}; 
+0

我很抱歉Ajay,可能我沒有足夠清晰地描述我的問題。我想要的是一個容器,它可以包含不同類型(地圖或地圖)。這是不可能的,因爲容器的元素需要是相同的類型,除非我定義了一些基類。 – pepero 2014-10-16 12:39:04

+0

http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part – Ajay 2014-10-16 12:39:38

0

你不能有不同類型的

std::vector但如果你能有基類

struct TriMapBase { virtual ~TriMapBase() = default; }; 
template <typename Map> struct TriMaps : TriMapBase { /* Your implementation */ }; 

那麼你可能有:

TriMapBase<std::map<int, int>> mapint; 
TriMapBase<std::map<int, char>> mapchar; 
std::vector<TriMapBase*> v = {&mapint, &mapchar}; 

,但你必須使用虛函數 或dynamic_cast來檢索t他後來正確的類型... 或使用