C++ 列挙型について基本的な質問があります。
列挙型は次のとおりです。
enum Names {
Tim = 0x1,
Bob = 0x2,
Jim = 0x4
};
値 (たとえば0x4
) を受け取った場合、関連する名前を出力したいと思います: Jim
。
それを行う方法はありますか?みたいなNames.key(0x04)
?これが Java に存在することは知っています。
ありがとう
C++ 列挙型について基本的な質問があります。
列挙型は次のとおりです。
enum Names {
Tim = 0x1,
Bob = 0x2,
Jim = 0x4
};
値 (たとえば0x4
) を受け取った場合、関連する名前を出力したいと思います: Jim
。
それを行う方法はありますか?みたいなNames.key(0x04)
?これが Java に存在することは知っています。
ありがとう
多くの人が言ったように、これはバニラ 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 に対してのみ使用できます。
いいえ、できません。C++ には存在しない機能であるリフレクションにより、Java ではこれが可能です。
できる最善の方法は、名前をマップに保存することです。
std::map<Names, std::string> names_string = {
{ Tim, "Tim"},
{ Bob, "Bob"}
// .....
};
std::cout << "Tim's enum: " << names_string[Tim] << std::endl;
これを処理する独自の関数を作成します...
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("");
}
いいえ、C++ でこれを行う方法はありません。まず、列挙型の名前がコンパイルされます。整数から列挙型に取得したい場合は、キャストできます。
あなたが持っていた場合も同様に
Foo foo = new Foo();
String name = "John";
int age = 23;
C++ で変数名を取得する方法はありません。
いいえ、これは不可能です。C++ のすべての識別子と同様に、これらは実行時に使用できなくなりました。あなたのユースケースには、列挙型よりもマップやセットの方が適しているのではないでしょうか?