dポイントプレゼントキャンペーン実施中!

列挙子(enumlator)の内容を文字列化するにはどうすればよいのでしょう。

今、VC++2008でプログラムしている初心者です。
列挙子が多いのですが、これを文字列化してメッセージに出したいと思っています。
ボックス化することで可能なようですが、具体的に説明していただけるとうれしいです。

また、この手法はLinuxなど他のOSについても同様でしょうか?
幾つか方法があるのなら、共通の方法を教えてくださるとうれしいです。

A 回答 (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));
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
助かりました。
いい面もある分、今まで簡単にできていたことがややこしくなって戸惑いました。

お礼日時:2010/02/11 10:30

言語が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;
}

とか。
    • good
    • 0
この回答へのお礼

ありがとうございます。C++/CLIはいろいろとできるのですね。
VisualC++特有なのですね。
ところで、このようにすると、
numbers = 1;
とすると、変換できなくなるようです。Parse()とか使用できるかと調べてみましたが、できないですね。
数値をenumに変換して入力するにはどうすればよいのでしょうか?

お礼日時:2010/02/10 14:02

基本的には無理です。


変数名と同じで、ソースコード上にのみ存在するので、コンパイルされてしまうと、失われてしまいます。

なので、なんらかの方法で、コンパイル後も情報が残るように工夫しなくてはなりません。
マクロを使うと、ある程度の省力化はできますが、数が多いとなかなか大変ですね。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2010/02/10 13:59

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),
....
};
か?
    • good
    • 0
この回答へのお礼

ありがとうございます。でも、よくわからなかったです。

お礼日時:2010/02/10 13:58

#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
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2010/02/10 13:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!