6

Bei der folgenden Typeigenschaft, wie kann ich Fields mit einigen std::pair s initialisieren?Wie initialisiert man eine statische std :: unordered_map eines Typmerkmals?

template <> 
struct ManagerDataTrait<Person> 
{ 
    static const std::unordered_map<std::string, std::string> Fields; 
    // ... 
}; 

Ich habe versucht, ein Lambda aber Visual Studio sagt mit, dass Fields keine Einheit ist, die explizit spezialisiert werden kann.

template <> 
const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields = []{ 
    std::unordered_map<std::string, std::string> fields; 
    fields.insert(std::make_pair("height", "FLOAT")); 
    fields.insert(std::make_pair("mass", "FLOAT")); 
    return fields; 
}; 

Wenn es keine Möglichkeit gibt, statische Elemente wie dies in Züge zu verwenden, die Alternativen kann ich die Informationen in einem Zug speichern haben? (Fields hält eine SQL-Datenbankstruktur.)

Update: Das Mitglied könnte auch const sein, aber das sollte nicht der Punkt sein.

+0

Für Ihr Lambda etwas arbeiten müßte, um tatsächlich das Lambda _run_, aber Sie haben nicht versucht zu tun (Sie haben gerade versucht, die Hash-Map aus dem Lambda zu konstruieren, das nicht gültig ist, aber das Lambda nicht ausführt.) –

Antwort

7

Kerrek SB Antwort wäre die richtige Antwort im Allgemeinen sein:

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ 
    { "blah", "blah" } 
    // ... 
}; 

(NB keine template<>, weil Sie ein Mitglied einer Spezialisierung sind definiert, keine Spezialisierung)

Aber die wird von Visual C++ nicht unterstützt. Die andere Alternative besteht darin, die Zuordnung mit einem Funktionsaufruf zu initialisieren und eine Zuordnung mit dem gewünschten Inhalt aus der folgenden Funktion zurückzuliefern:

std::unordered_map<std::string, std::string> 
getFields() 
{ 
    std::unordered_map<std::string, std::string> fields; 
    fields["blah"] = "blah"; 
    // ... 
    return fields; 
} 

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields = getFields(); 

Ein Lambda ist nur syntaktischer Zucker für die gleiche Sache, und ich bin mir nicht sicher, es ist klarer, ein Lambda zu verwenden, weil die Syntax ein bisschen hässlicher ist.

16

Sie erkennen, dass Sie Karten aus verspannten Listen initialisieren können?

std::unordered_map<std::string, std::string> m { { "a", "bc" } 
               , { "b", "xy" } 
//            ... 
               }; 
+0

Die Lösung war, die 'Schablone <>' loszuwerden, auf die Sie hingewiesen haben in einem jetzt gelöschten Kommentar. Könnten Sie das bitte zu Ihrer Antwort hinzufügen? Ich werde es dann als akzeptiert markieren. – danijar

+0

Ich habe einen solchen Kommentar gemacht (und gelöscht), ist das der, den du meinst? –

+0

@ JonathanWakely Du hast Recht, ich meinte deinen Kommentar. Ich habe das gemischt. – danijar

0

Visual C++ unterstützt nun statische Initialisierung von verspannten Listen, so dass Sie etwas tun könnten:

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ { "abc", "xyz" }, { "cde", "zyx" } ...}; 
Verwandte Themen