web-dev-qa-db-ja.com

C ++の文字列型の列挙クラス

-背景情報:

C++ 11には、変数を内部に格納できるenumクラスと呼ばれるクラスがあります。ただし、クラスの型はcharであるとしか見ていません。

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

-質問:

この文字列型の列挙型クラスを表現する方法はありますか?

例えば、

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

-私が思うこと:

私はそれを使用しようとしましたが、エラーが発生しました。正しく実行しているかどうかはわかりません。文字列を使用したい理由は、文字列が同時に複数の文字を保持できるため、コードでより便利になったためです。

8
Kourosh

C++ 11またはC++ 14でそれを行う方法はありません。ただし、 enum class を使用することを検討してから、明示的な関数または演算子をコーディングして、_std::string_- sとの間で変換する必要があります。

C++ 11には、変数を内部に格納できるenumクラスと呼ばれるクラスがあります。

その言い回しは正しくありません:enumクラスは変数を保存しません(ただしenumerators)。

だからあなたはコーディングするかもしれません:

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

(これは druckermanlyによる回答 として可能です。なぜならchar整数型であるためです;もちろん代わりに文字列を使用することはできません)

次に、いくつかのMyEnum string_to_MyEnum(const std::string&);関数(引数が予期しない文字列の場合、おそらく何らかの例外をスローします)と別のstd::string MyEnum_to_string(MyEnum);関数を定義します。 キャスト演算子 を呼び出すことも考えられるかもしれません(しかし、あなたの場合、それが読みにくいと思います)。 MyEnum型の単一のデータメンバーを含む_class MyEnumValue_を定義し、そのクラスに キャスト演算子 を持たせることもできます。

_ 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....
 };
_

MyEnumValue5の規則 を参照)に適切なものがあれば、ほとんど常にMyEnumValueの代わりにMyEnum(おそらく_class MyEnumValue_の内部

いいえ、これは不可能です。

http://en.cppreference.com/w/cpp/language/enum 状態:

定数の値は、列挙の基になる型として知られる整数型の値です。

キーポイントは「整数型」です。文字列は整数型ではありません。

3
druckermanly

コンパイラは内部的にcharを同等のint表現(ASCII)に変換します。そのため、代わりに文字列を使用することはできません。

0
stanleyli