相关疑难解决方法(0)

从初始化列表初始化,但没有{{{{{{{{{}}}}}}}}?

我最近遇到了初始化列表的一些问题.考虑一个存储类似地图数据的程序

struct MyMapLike {
  MyMapLike(std::map<std::string, int> data)
    :data(std::move(data))
  { }

private:
  std::map<std::string, int> data;
};
Run Code Online (Sandbox Code Playgroud)

这看起来很直接.但是在初始化时,它会变得难看.我想让它看起来像

MyMapLike maps = { { "One", 1 }, { "Two", 2 } };
Run Code Online (Sandbox Code Playgroud)

但是编译器并不想接受这一点,因为上面意味着它应该寻找一个两个参数的构造函数,可以接受{ "One", 1 }{ "Two", 2 }分别.我需要添加额外的大括号,使它看起来像一个单参数构造函数接受{ { ... }, { ... } }

MyMapLike maps = { { { "One", 1 }, { "Two", 2 } } };
Run Code Online (Sandbox Code Playgroud)

我不想那样写.由于我有类似map的类,并且初始化程序具有映射列表的抽象值,因此我想使用前一版本,并且独立于任何此类实现细节,例如构造函数的嵌套级别.

一个解决方法是声明一个初始化列表构造函数

struct MyMapLike {
  MyMapLike(std::initializer_list< 
    std::map<std::string, int>::value_type
    > vals)
    :data(vals.begin(), vals.end())
  { }

  MyMapLike(std::map<std::string, int> data) …
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list c++11

24
推荐指数
3
解决办法
3359
查看次数

标签 统计

c++ ×1

c++11 ×1

initializer-list ×1