Diese Frage wurde hier in einer allgemeineren Form gestellt: Wie man enums aus einem std :: iStream generisch liest .
Das OP hatte fast eine funktionierende Lösung wie es war; Er hatte nur Probleme mit const
und ein paar unnötigen Winkeln. Hier ist die Arbeitslösung konkretisiert:
Die Funktionsvorlage read_enum
erfüllt denselben Zweck wie std::make_pair
oder std::make_shared
in der Standardbibliothek: Sie erlaubt uns, auf die spitzen Klammern zu verzichten. Sie könnten genauso gut in >> EnumReader<enSide>(val.mSide) >> EnumReader<enType>(val.mType)
schreiben, aber das ist mehr Tipparbeit (Wortspiel beabsichtigt).
Die Standardbibliotheken einiger Anbieter fehlen angeblich noch std::underlying_type
von ihren <type_traits>
-Köpfen. Wenn Sie eine dieser unvollständigen Bibliotheken haben, können Sie eine der in Wie kann man den zugrunde liegenden Typ der Klassenaufzählung erkennen? .