我想知道做这样的事情的最佳方式或更好的方法:
template <int N,typename T,typename X>
class MyMap : public map<T,MyMap<N-1,T,X>>{};
template <typename T,typename X>
class MyMap<1,T,X> : public map<T,X>{};
int main(int argc, char* argv[])
{
MyMap<4,string,double> myMap;
myMap["a"]["b"]["c"]["d"] = 123.456;
cout << myMap["a"]["b"]["c"]["d"];
return 0;
}
答案 0 :(得分:6)
你应该使用typedef,而不是继承,并为参数提供更有意义的名称和那种东西,以便它更具可读性。
template<int N, typename Key, typename Value> struct map {
typedef std::map<Key, typename Map<N - 1, Key, Value>::type> type;
};
template<typename Key, typename Value> struct map<1, Key, Value> {
typedef std::map<Key, Value> type;
};
int main() {
map<4, string, double>::type lolsmap;
}
答案 1 :(得分:4)
不要继承。使用类创建具有元编程的类型,然后使用它。我已编译此代码,它应该可以工作:
#include <map>
#include <iostream>
template <int N, typename T, typename X>
class MyMapCreator {
public:
typedef ::std::map<T, typename MyMapCreator<N - 1, T, X>::type> type;
};
template <typename T, typename X>
class MyMapCreator<1, T, X> {
public:
typedef ::std::map<T, X> type;
};
int main(int argc, char *argv[])
{
using ::std::cout;
MyMapCreator<4, ::std::string, double>::type myMap;
myMap["a"]["b"]["c"]["d"] = 123.456;
cout << myMap["a"]["b"]["c"]["d"];
return 0;
}