【问题标题】:Constructor similar to std::map or std::vector in a class类中类似于 std::map 或 std::vector 的构造函数
【发布时间】:2014-03-23 05:05:51
【问题描述】:

我正在创建一个类,我想知道如何创建类似于std::mapstd::vector 样式的构造函数。

std::map<std::string, std::string> map = {
    {"foo", "bar"},
    {"biz", "buz"},
    {"bez", "boz"}
};

不同之处在于我不希望我的班级像std::map 那样询问想要接受的类型。

std::map<std::string, std::string>

我希望我的班级接受这种风格的论点:

{
    {"foo", "bar"},
    {"biz", "buz"},
    {"bez", "boz"}
};

但具有定义的类型。 (std::string, Typer)

“Typer”是我将作为值插入到 std::map 上的一个类。

【问题讨论】:

  • 你不能推导出初始化列表。
  • 简单的答案是:使用map作为第二个参数,如下: const std::map<:string std::string>& data。在这种情况下,您可以将您的语法用于第二个参数。顺便说一句,这不是一个重复的问题。你不需要在这里使用初始化列表。这适用于 VS2013 和 GCC 4.8.1。

标签: c++ c++11 vector std


【解决方案1】:

如果我正确理解您的问题,您希望构造函数采用std::initializer_list&lt;std::pair&lt;std::string, Typer&gt;&gt;,如下所示:

struct Typer
{
  std::string data;

  Typer(const char *s) : data(s) {}
};


struct MyClass
{
  MyClass(std::initializer_list<std::pair<std::string, Typer>> i)
    : myMap(begin(i), end(i))
  {}

  std::map<std::string, Typer> myMap;
};

int main()
{
  MyClass m = {
    {"foo", "bar"},
    {"biz", "buz"},
    {"bez", "boz"}
  };
}

Live example

【讨论】:

    【解决方案2】:

    typedef std::map&lt;std::string, Typer&gt; MyType;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-10
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2016-11-04
      • 1970-01-01
      相关资源
      最近更新 更多