创建std :: maps的递归std :: map

时间:2011-05-20 00:45:58

标签: c++ template-meta-programming

我想知道做这样的事情的最佳方式或更好的方法:

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;
}

2 个答案:

答案 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;
}