我有一個模板類,可以有一個地圖類型作爲模板參數。C++模板地圖本身包含
template<typename map_t> class my_class
{
map_t my_map;
};
現在我想讓地圖的值類型等於這個類。
my_class<std::map<std::string, my_class<...> > > problems;
但是,這是不可能申報的。我怎樣才能達到同樣的效果?
我有一個模板類,可以有一個地圖類型作爲模板參數。C++模板地圖本身包含
template<typename map_t> class my_class
{
map_t my_map;
};
現在我想讓地圖的值類型等於這個類。
my_class<std::map<std::string, my_class<...> > > problems;
但是,這是不可能申報的。我怎樣才能達到同樣的效果?
既然你要在容器類型通用的,最近我已經能夠找到(如果我沒有理解好您的意思)是:
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;
你不能那樣做。 您可以做的最近的事情是Curiously recurring template pattern。
你有沒有試過這種
template<typename T> class my_class
{
std::map< std::string , my_class> my_map;
};
它可能會更好,如果你不將地圖傳作爲模板參數,而是通過地圖鍵,值和比較運算作爲模板參數
我需要能夠將容器作爲模板參數傳遞,以便能夠使用不同的容器。這允許爲特定情況優化容器。 – Ruud
似乎就像你應該能夠轉發聲明my_class<T>
並使用指針作爲你的mapped_type
(在C++ value_type
意味着一對包括映射的鍵和值)。
你不能這樣做,因爲它是無限遞歸的。你可以做一個固定的深度,或者你將不得不使用通過繼承,變體或類似的東西來動態確定值。
這是不正確的。我可以用一個硬編碼的std :: map替換模板化的map_t,這樣可以正常工作。 – Ruud
正如其他人指出,你不能創建一個無限遞歸類定義,但你肯定可以嵌套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;
}
類實際上並不能包含本身成爲會員(覺得你需要多少內存來容納它),但是它可以包含一個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;
};
好的。但爲什麼你需要這樣的事情? – Ajay
我需要這個來實現一個靈活的序列化解決方案。 – Ruud