- ベストアンサー
列挙子(enumlator)の内容を文字列化するにはどうすればよいので
列挙子(enumlator)の内容を文字列化するにはどうすればよいのでしょう。 今、VC++2008でプログラムしている初心者です。 列挙子が多いのですが、これを文字列化してメッセージに出したいと思っています。 ボックス化することで可能なようですが、具体的に説明していただけるとうれしいです。 また、この手法はLinuxなど他のOSについても同様でしょうか? 幾つか方法があるのなら、共通の方法を教えてくださるとうれしいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>数値をenumに変換して入力するにはどうすればよいのでしょうか? enum class型の変数へ数値を直接代入するには以下のようにします。(面倒・・・) Numbers^ numbers = static_cast<Numbers^>(Enum::ToObject(Numbers::typeid, 2)); ただし、この方法で代入する場合、enum class型に定義されていない数値も代入できてしまいます。これを回避するためにはIsDefinedメソッドを使用します。 Numbers^ numbers = Numbers::Fifth; if(Enum::IsDefined(Numbers::typeid, 9)) { numbers = static_cast<Numbers^>(Enum::ToObject(Numbers::typeid, 9)); }
その他の回答 (4)
- reset_cat
- ベストアンサー率68% (94/138)
言語がC++/CLIであれば、enumの代わりにenum classを利用することで簡単に列挙子名を出力できます。 #1さんの例をenum classで書くと・・・ enum class Numbers { First=1, Second, Third, Fourth, Fifth, Sixth, Seventh }; [STAThreadAttribute] int main(array<System::String ^> ^args) { System::Enum^ numbers = Numbers::Fifth; System::Console::WriteLine("Value is '{0}'", numbers->ToString()); return 0; } とか。
お礼
ありがとうございます。C++/CLIはいろいろとできるのですね。 VisualC++特有なのですね。 ところで、このようにすると、 numbers = 1; とすると、変換できなくなるようです。Parse()とか使用できるかと調べてみましたが、できないですね。 数値をenumに変換して入力するにはどうすればよいのでしょうか?
- titokani
- ベストアンサー率19% (341/1726)
基本的には無理です。 変数名と同じで、ソースコード上にのみ存在するので、コンパイルされてしまうと、失われてしまいます。 なので、なんらかの方法で、コンパイル後も情報が残るように工夫しなくてはなりません。 マクロを使うと、ある程度の省力化はできますが、数が多いとなかなか大変ですね。
お礼
ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
C++ にはそもそも「ボックス化」が存在しないんだけど.... C++/CLI は知らん. 列挙子の範囲が 0以上かつ狭いなら #define DefineEnumerator(x) x enum Hoge { DefineEnumerator(First), DefineEnumerator(Second), .... }; #undef DefineEnumerator // ※ #define DefineEnumerator(x) #x static const char *HogeStrings[] = { DefineEnumerator(First), DefineEnumerator(Second), .... }; くらい. 値に制限がないなら std::map を使って上の※以降を #include <map> #define DefineEnumerator(x) { x, #x } static const std::map<Hoge, const char *> HogeStrings = { DefineEnumerator(First), DefineEnumerator(Second), .... }; か?
お礼
ありがとうございます。でも、よくわからなかったです。
- chie65536(@chie65535)
- ベストアンサー率44% (8804/19965)
#define DEBUG_PRINT(a) printf("%s=%d\n",#a,a) enum { First=1, Second, Third, Fourth, Fifth, Sixth, Seventh }; int main(void) { DEBUG_PRINT(Third); DEBUG_PRINT(Sixth); } 実行結果 Third=3 Sixth=6
お礼
ありがとうございます。
お礼
ありがとうございます。 助かりました。 いい面もある分、今まで簡単にできていたことがややこしくなって戸惑いました。