2011-08-07 86 views
3

我有一個模板類,可以有一個地圖類型作爲模板參數。C++模板地圖本身包含

template<typename map_t> class my_class 
{ 
    map_t my_map; 
}; 

現在我想讓地圖的值類型等於這個類。

my_class<std::map<std::string, my_class<...> > > problems; 

但是,這是不可能申報的。我怎樣才能達到同樣的效果?

+1

好的。但爲什麼你需要這樣的事情? – Ajay

+0

我需要這個來實現一個靈活的序列化解決方案。 – Ruud

回答

1

既然你要在容器類型通用的,最近我已經能夠找到(如果我沒有理解好您的意思)是:

template <template <typename, typename> class Map> 
struct my_class 
{ 
    typedef typename Map<std::string, my_class>::type map_t; 
    map_t children; 
}; 

// Since the standard doesn't allow default arguments to be 
// taken into account for template template parameters, we 
// have to close them. 
// Write one such structure for each map type you want. 
struct std_map 
{ 
    template <typename Key, typename Value> 
    struct rebind { typedef std::map<Key, Value> type; } 
}; 

和使用

my_class<std_map::rebind> problematic_tree; 
+0

非常感謝,這是我尋找的解決方案! – Ruud

+1

我仍然想知道,這個解決方案是如何工作的?你能解釋爲什麼這個工作? – Ruud

1

你有沒有試過這種

template<typename T> class my_class 
{ 

    std::map< std::string , my_class> my_map; 
}; 

它可能會更好,如果你不將地圖傳作爲模板參數,而是通過地圖鍵,值和比較運算作爲模板參數

+0

我需要能夠將容器作爲模板參數傳遞,以便能夠使用不同的容器。這允許爲特定情況優化容器。 – Ruud

0

似乎就像你應該能夠轉發聲明my_class<T>並使用指針作爲你的mapped_type(在C++ value_type意味着一對包括映射的鍵和值)。

1

你不能這樣做,因爲它是無限遞歸的。你可以做一個固定的深度,或者你將不得不使用通過繼承,變體或類似的東西來動態確定值。

+0

這是不正確的。我可以用一個硬編碼的std :: map替換模板化的map_t,這樣可以正常工作。 – Ruud

0

正如其他人指出,你不能創建一個無限遞歸類定義,但你肯定可以嵌套my_class有限的次數。這裏有一個工作示例:

#include <map> 
#include <string> 
#include <iostream> 

template<typename map_t> struct my_class { 
    map_t my_map; 
}; 

my_class<std::map<std::string, my_class<std::map<std::string, int> > > > problems; 

int main() { 
    std::cout << problems.my_map.size(); 
    return 0; 
} 
0

類實際上並不能包含本身成爲會員(覺得你需要多少內存來容納它),但是它可以包含一個POIN本身就是。你可以使用引用的模式J-16 SDiZ或者一些誘餌和開關來實現:

template<typename map_t> class my_class 
{ 
    map_t * my_map; 
}; 

class dummy; 
template<> 
class my_class<dummy> 
{ 
    my_class<dummy> * my_map; 
};