2017-01-16 65 views
2

如果我有一個std::map<int, char>,這是很好的和容易初始化:初始化的std ::地圖,使用缺省構造值

std::map<int, char> myMap = 
{ 
    { 1, 'a' }, 
    { 2, 'b' } 
}; 

如果我的價值型有一個默認的構造函數,我可以初始化它像這樣:

struct Foo 
{ 
    char x; 
}; 

std::map<int, Foo> myMap = 
{ 
    { 1, Foo() }, 
    { 2, Foo() } 
}; 

但是假設我的價值型有一個默認的構造函數,但笨重鍵入:

std::map<int, yourNamespace::subLibrary::moreLevels::justBecause::Thing> myMap = 
{ 
    // What goes here? I don't want to type 
    // yourNamespace::subLibrary::moreLevels::justBecause::Thing again. 
}; 

短缺using聲明使值類型更加鍵盤友好,有沒有辦法用一組鍵來初始化map,所有這些鍵都使用默認構造的yourNamespace::subLibrary::moreLevels::justBecause::Thing?我如何表示我希望映射的值是其默認構造的類型?

回答

4

您可以使用value initialization來解決此問題。

struct Foo 
{ 
    char x; 
}; 

std::map<int, Foo> myMap = 
{ 
    { 1, {} }, 
    { 2, {} } 
}; 
+0

我以爲我可以,而且我嘗試過,而且沒有奏效......這就是我來到這裏的原因。進一步prodding顯示它在一般情況下工作,但如果值類型不是可複製構造的,則不適用。你知道爲什麼不? – Chowlett

+0

@Chowlett關於你的後續問題,我會把你推薦給[這個答案](http://stackoverflow.com/a/7232135/7359094)。 –

+0

啊。這將解釋它。因此,我是以這種方式完成初始化的?我注意到,即使'myMap = {{1,Foo()}};'失敗了,大概是完全一樣的原因。 – Chowlett

0

您可以創建一個函數,返回「yourNamespace :: subLibrary :: moreLevels :: justBecause :: Thing」的實例。