2017-01-16 4 views
2

Если у меня есть std::map<int, char>, это приятно и легко инициализируется:Инициализировать зЬй :: карты, используя стандартные возведенных значения

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

Я думал, что смогу, и я попробовал, и это не сработало ... вот почему я пришел сюда. Дальнейшее подталкивание показывает, что оно работает в общем_, но не в том случае, если тип значения не является конструктивным. Вы знаете, почему нет? – Chowlett

+0

@Chowlett Что касается вашего последующего вопроса, я передам вам [этот ответ] (http://stackoverflow.com/a/7232135/7359094). –

+0

Ах. Это объяснит это. Итак, я полностью заполнен для инициализации таким образом? Я отмечаю, что даже 'myMap = {{1, Foo()}};' fail, по-видимому, точно по той же причине. – Chowlett

0

Вы могли бы сделать функцию, которая возвращает экземпляр "yourNamespace :: подбиблиотеке :: moreLevels :: justBecause :: Thing".

Смежные вопросы