Подтвердить что ты не робот

Сокращенный синтаксис для карты С++ на карте

Если у меня есть такие определения, как:

typedef map<string, Foo> Foo_map_1
typedef map<string, Foo_map_1> Foo_map_2
typedef map<string, Foo_map_2> Foo_map_3
typedef map<string, Foo_map_3> Foo_map_4
typedef map<string, Foo_map_4> Foo_map_5

В любом случае я могу обобщить это, чтобы я мог, например,

Foo_map<10>

и иметь 10-кратную вложенную карту. Мне не нужно что-то вроде boost::recursive_wrapper, потому что количество уровней всегда постоянное.

4b9b3361

Ответ 1

Это кажется достаточно простым даже для ограниченной способности метапрограммирования С++:

#include <map>
#include <string>

template<int N, typename K, typename V>
struct NMap { typedef std::map<K, typename NMap<N-1, K, V>::type> type; };

template<typename K, typename V>
struct NMap<1, K, V> { typedef std::map<K, V> type; };

int main(int argc, const char *argv[]) {
    NMap<3, int, std::string>::type m;
    m[1][2][3] = "Test";
    return 0;
}

Ответ 2

Это работает для меня.

#include <iostream>
#include <string>
#include <map>
using namespace std;

struct Foo
{
   Foo() : _in(0) {}
   Foo(int in) : _in(in) {}
   int _in;
};

template <int N> struct Foo_map
{
   map<string, Foo_map<N-1> > foo_Map;
   Foo_map<N-1>& operator[](string const& key) { return foo_Map[key]; }
};

template <> struct Foo_map<1>
{
   map<string, Foo> foo_Map;
   Foo& operator[](string const& key) { return foo_Map[key]; }
};

int main()
{
   Foo_map<1> map1;
   map1["abcd"] = Foo(10);

   Foo_map<2> map2;
   map2["a"]["b"] = Foo(20);

   Foo_map<10> map10;
   map10["a"]["b"]["c"]["d"]["e"]["f"]["g"]["h"]["i"]["j"] = Foo(100);

   std::cout << map1["abcd"]._in << std::endl;
   std::cout << map2["a"]["b"]._in << std::endl;
   std::cout << map10["a"]["b"]["c"]["d"]["e"]["f"]["g"]["h"]["i"]["j"]._in << std::endl;
}

Результат запуска программы:

10
20
100