2014-02-21 62 views
11

我正在创建一个类,我想知道如何创建类似于std::mapstd::vector风格的构造函数。类似std :: map或std :: 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的值。

+0

不能推断初始化列表。 –

+1

简单的答案是:使用地图作为第二个参数,如下所示:const std :: map &data。在这种情况下,您可以使用第二个参数的语法。顺便提一下,这不是一个重复的问题。您无需在此使用初始化程序列表。这适用于VS2013和GCC 4.8.1。 –

回答

23

如果我正确理解你的问题,你想有一个构造函数取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"} 
    }; 
} 

Live example

3

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

相关问题