在一个类中创建类似于std::map或std::vector的构造函数

12

我正在创建一个类,想知道如何创建类似于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中。


你无法推断初始化列表。 - Kerrek SB
1
简单的答案是:使用map作为第二个参数,如下所示:const std::map<std::string, std::string>& data。在这种情况下,您可以使用第二个参数的语法。顺便说一句,这不是重复的问题。您不需要在此处使用初始化列表。这在VS2013和GCC 4.8.1中都可以工作。 - Mikhail Semenov
2个回答

24

如果我理解你的问题正确,你希望有一个构造函数接受 std::initializer_list<std::pair<std::string, Typer>>,像这样:

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

实时示例


3

typedef std::map<std::string, Typer> MyType;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接