Пользовательский составной конструктор списка инициализатора - PullRequest
1 голос
/ 30 апреля 2020

Например, nlohmann json имеет способ преобразования совокупного списка инициализаторов в объект JSON:

json j = {
  {"pi", 3.141},
  {"happy", true},
  {"name", "Niels"},
  {"nothing", nullptr},
  {"answer", {
    {"everything", 42}
  }},
  {"list", {1, 0, 2}},
  {"object", {
    {"currency", "USD"},
    {"value", 42.99}
  }}
};

, а c ++ std::map также имеет аггерат список инициализаторов

{
{"one": 1},
{"two": 2}
}

Мне интересно, как можно написать собственный (совокупный) список инициализаторов инициализатора

1 Ответ

1 голос
/ 30 апреля 2020

В стандартной библиотеке легко узнать, как это сделать.

Посмотрите на конструктор std::map :

map( std::initializer_list<value_type> init,
     const Compare& comp = Compare(),
     const Allocator& alloc = Allocator() );

value_type is

std::pair<const Key, T>, Key is std::string, T is int

Таким образом, конструктор

map( std::initializer_list<std::pair<std::string, int>> init,
     const Compare& comp = Compare(),
     const Allocator& alloc = Allocator() );

и может использоваться как с

{
  std::pair("one", 1),
  std::pair("two", 2),
}

Затем посмотрите на std::pair конструктор

pair( const T1& x, const T2& y );

Он может быть построен как

std::pair<std::string, int> a{"one", 1};

или

std::pair<std::string, int> a = {"one", 1};

Учитывая все вышеизложенное, карта может быть построена как с помощью

{
{"one", 1},
{"two", 2}
}
...