自定义聚合初始化列表构造函数

Custom aggregate initializer list constructor

例如,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 也有一个 aggeragte initalizer 列表

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

我很好奇如何编写自定义(聚合)初始化器列表初始化器

在标准库中很容易学习 howtos。

看看 std::map constructor:

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

value_type

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() );

并且可以像with

一样使用
{
  std::pair("one", 1),
  std::pair("two", 2),
}

再看std::pair constructor

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