it-swarm.com.de

aufzählungsklasse des Typs string in C++

- Hintergrundinformation:

In C++ 11 gibt es eine Klasse, die als Enum-Klasse bezeichnet wird und in der Sie Variablen speichern können. Ich habe jedoch nur den Typ der Klasse als Zeichen gesehen:

enum class : char {
   v1 = 'x', v2 = 'y'
};

- Frage:

Gibt es eine Möglichkeit, diese Enumenklasse vom Typ string auszudrücken?

Zum Beispiel,

enum class : string{
  v1 = "x", v2 = "y"
};

- Was ich denke:

Ich habe es versucht, aber ich habe Fehler, ich bin mir nicht sicher, ob ich es richtig mache oder nicht. Der Grund, warum ich Strings verwenden möchte, ist, dass sie in der Lage sind, mehrere Zeichen gleichzeitig zu speichern, sodass sie für meinen Code nützlicher sind.

6
Kourosh

Dies ist in C++ 11 oder C++ 14 nicht möglich. Sie sollten jedoch über einige enum-Klassen verfügen und dann einige explizite Funktionen oder Operatoren codieren, um sie von und nach std::string- s zu konvertieren.

In C++ 11 gibt es eine Klasse, die als Enum-Klasse bezeichnet wird und in der Sie Variablen speichern können. 

Diese Phrasierung ist nicht korrekt: Eine Enum-Klasse speichert keine Variablen (sondern Enumerators).

Sie könnten also Folgendes schreiben:

enum class MyEnum : char {
   v1 = 'x', v2 = 'y'
};

(Dies ist möglich, da von druckermanly geantwortet wurde, da char ein integraler Typ ist; natürlich können Sie stattdessen keine Strings verwenden.)

definieren Sie dann eine MyEnum string_to_MyEnum(const std::string&);-Funktion (dies würde wahrscheinlich eine Ausnahme auslösen, wenn das Argument eine unerwartete Zeichenfolge ist) und eine andere std::string MyEnum_to_string(MyEnum);-Funktion. Sie könnten sogar in Betracht ziehen, einige cast-Operatoren zu haben sie zu nennen (aber ich finde das in Ihrem Fall nicht lesbar). Sie könnten auch einen class MyEnumValue definieren, der ein einzelnes Datenelement vom Typ MyEnum enthält, und diese Klasse mit cast-Operator haben, z.

 class MyEnumValue {
    const MyEnum en;
 public:
    MyEnumValue(MyEnum e) : en(e) {};
    MyEnumValue(const std::string&s)
     : MyEnumValue(string_to_MyEnum(s)) {};
    operator std::string () const { return MyEnum_to_string(en);};
    operator MyEnum () const { return en };
    //// etc....
 };

Mit entsprechenden weiteren Dingen in MyEnumValue (siehe Regel von fünf ) können Sie fast immer MyEnumValue anstelle von MyEnum verwenden (was möglicherweise sogar intern für class MyEnumValue ist).

Nein das ist nicht möglich.

http://en.cppreference.com/w/cpp/language/enum states:

Die Werte der Konstanten sind Werte eines ganzzahligen Typs, der als zugrunde liegender Typ der Aufzählung bezeichnet wird.

Der Schlüsselpunkt ist "Integraltyp" - eine Zeichenfolge ist kein Integraltyp.

2
druckermanly

Der Compiler konvertiert Ihr Zeichen intern in die entsprechende Int-Darstellung (ASCII). Es ist also nicht möglich, stattdessen string zu verwenden.

0
stanleyli