2014-02-21 61 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;

相關問題