2017-01-16 1 views
2

Wenn ich einen std::map<int, char> haben, ist es schön und einfach zu initialisieren:initialisieren std :: map, default-rechnerisch ermittelten Werte mit

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

Wenn mein Wert-Typ einen Standardkonstruktor hat, wie ich es wie so initialisieren kann :

struct Foo 
{ 
    char x; 
}; 

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

aber mein Wert-Typ annehmen, hat einen Standard-Konstruktor, ist aber unhandlich Typ:

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

Kurz vor einer using Deklaration, um den Werttyp tastaturfreundlicher zu machen, gibt es eine Möglichkeit, die map mit einer Reihe von Schlüsseln zu initialisieren, die alle eine standardkonstruierte yourNamespace::subLibrary::moreLevels::justBecause::Thing verwenden? Wie kann ich signalisieren, dass der abgebildete Wert standardmäßig seinem Typ entspricht?

Antwort

4

Sie können value initialization verwenden, um dieses Problem zu lösen.

struct Foo 
{ 
    char x; 
}; 

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

Ich dachte, ich könnte, und ich habe es versucht, und es hat nicht funktioniert ... weshalb ich hierher kam. Weiteres Hervorheben zeigt, dass es _in general_ funktioniert, aber nicht, wenn der Werttyp nicht kopierkonstruierbar ist. Weißt du warum nicht? – Chowlett

+0

@Chowlett In Bezug auf Ihre Follow-up-Frage verweise ich Sie auf [diese Antwort] (http://stackoverflow.com/a/7232135/7359094). –

+0

Ah. Das würde es erklären. Bin ich also auf diese Weise komplett initialisiert? Ich stelle fest, dass sogar 'myMap = {{1, Foo()}};' aus vermutlich genau demselben Grund fehlschlägt. – Chowlett

0

Sie könnten eine Funktion machen, die eine Instanz von "yourNamespace :: Unterbibliothek :: moreLevels :: justBecause :: Thing" zurück.

Verwandte Themen