2

C++ 列挙型について基本的な質問があります。

列挙型は次のとおりです。

enum Names {
    Tim     =       0x1,
    Bob     =       0x2,
    Jim     =       0x4
};

値 (たとえば0x4) を受け取った場合、関連する名前を出力したいと思います: Jim

それを行う方法はありますか?みたいなNames.key(0x04)これが Java に存在することは知っています

ありがとう

4

5 に答える 5

2

多くの人が言ったように、これはバニラ C++ では不可能です。ただし、Qt を使用する場合は、Qt メタ システムに登録されている列挙型を定義できるため、実行時に列挙型情報を取得できます。

QMetaEnum クラスは、列挙子に関するメタデータを提供します。

列挙子の名前には name() を使用します。列挙子のキー (列挙された各項目の名前) は、key() によって返されます。keyCount() を使用してキーの数を見つけます。isFlag() は、列挙子がフラグとして使用されるかどうかを返します。つまり、OR 演算子を使用してその値を組み合わせることができます。

変換関数 keyToValue()、valueToKey()、keysToValue()、および valueToKeys() を使用すると、列挙値または設定値の整数表現とそのリテラル表現との間の変換が可能になります。scope() 関数は、この列挙子が宣言されたクラス スコープを返します。

 class MyClass : public QObject
 {
     Q_OBJECT
     Q_ENUMS(Priority)

 public:
     MyClass(QObject *parent = 0);
     ~MyClass();

     enum Priority { High, Low, VeryHigh, VeryLow };
     void setPriority(Priority priority);
     Priority priority() const;
 };

メカニズム全体が Qt メタ システムを使用するため、このアプローチは QObject 派生クラスのメンバーである enum に対してのみ使用できます。

于 2013-04-02T15:04:43.463 に答える
2

いいえ、できません。C++ には存在しない機能であるリフレクションにより、Java ではこれが可能です。

できる最善の方法は、名前をマップに保存することです。

std::map<Names, std::string> names_string = {
    { Tim, "Tim"},
    { Bob, "Bob"}
    // .....
};

std::cout << "Tim's enum: " << names_string[Tim] << std::endl;
于 2013-04-02T15:00:29.810 に答える
0

これを処理する独自の関数を作成します...

enum Names {
    Tim     =       0x1,
    Bob     =       0x2,
    Jim     =       0x4
};

std::string GetNameString(int nName)
{
    if( nName == Tim )
        return std::string("Bob");
    else if( nName == Bob )
        return std::string("Tim");
    else if( nName == Jim )
        return std::string("Jim");

    return std::string("");
}
于 2013-04-02T15:08:36.960 に答える
0

いいえ、C++ でこれを行う方法はありません。まず、列挙型の名前がコンパイルされます。整数から列挙型に取得したい場合は、キャストできます。

あなたが持っていた場合も同様に

Foo foo = new Foo();
String name = "John";
int age = 23;

C++ で変数名を取得する方法はありません。

于 2013-04-02T14:59:27.243 に答える
0

いいえ、これは不可能です。C++ のすべての識別子と同様に、これらは実行時に使用できなくなりました。あなたのユースケースには、列挙型よりもマップやセットの方が適しているのではないでしょうか?

于 2013-04-02T15:00:42.640 に答える