2017-01-16 55 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”的实例。