Java5でenumが使えるようになる前のJava1.4時代に使われていた、
「Typesafe enum」と呼ばれるパターンもありなのかも。
後は、用途によっては、ストリーム(<<,>>)ってのもありかも。
std::ostrean% operator <<(std::ostream& os, EN_COLOR color);
こいつを定義してしまえば、
std::wcout << CColorEnum::RED <<std::endl;
std::wcout << CColorEnum::BLUE <<std::endl;
直接変換が可能ですし。(変換したくないストリーム入出力が別にあると工夫が必要…)
失礼、こうですね。
namespace foo {
enum EN_COLOR{ RED, BLUE, YELLOW, MAX_COLOR };
std::ostrean& operator <<(std::ostream& os, EN_COLOR color);
// MAX_COLORが渡されたら、std::invalid_argumentでしょうかね…。
}
で、こんな感じで。
std::wcout << foo::RED <<std::endl;
std::wcout << foo::BLUE <<std::endl;
皆さん、どうも本当にありがとうございます。
オーバーロードの使い方がちょっと分かり、少し賢くなりました。
焼肉奉行さん、普通の方法と、[]演算子のオーバーロードの使い方ご教示して頂き、
ありがとうございます、大変参考なりす。また、
std::wcout << col[col.BLUE] <<std::endl;
ここの部分で、col.BLUEはenum値なのでint型と等価という事で1(col.BLUE)を入れても
std::wcout << col[1] <<std::endl;
コンパイラがエラーを出し、しっかり二項演算子の型チェックを行っているのも確認でき
ました。
Banさんの
出力ストリームを、<<演算子にオーバーロードさせる方法なのですが、下記の様に書いて
みたのですが、
この部分でstd::ostream& operator <<(std::ostream& os, EN_COLOR color)
error C2804: binary 'operator <<' に引数が多すぎます。
error C2333: 'foo::operator <<' : 関数宣言のエラーです。関数の本体は無視されます
エラーが出てしまいます、間違いを指摘して頂けないでしょうか。
宜しくお願い致します。
#include stdafx.h
#include <string>
#include <iostream>
class foo {
static std::wstring name[];
public:
enum EN_COLOR{
RED,
BLUE,
YELLOW
};
std::ostream& operator <<(std::ostream& os, EN_COLOR color)
{
os << name[color];
return os;
}
};
std::wstring foo::name[] =
{
L赤,
L青,
L黄,
};
int _tmain(int argc, _TCHAR* argv[])
{
std::wcout << foo::BLUE <<std::endl;
return 0;
}
'friend'忘れ?
>> 自分だったらstd::map<EN_COLOR,std::string>にするかな。
>いや、文字列からenumへの変換もやりたいってことでしたので。
>enumで表現できる程度の要素数であればmap使うほどのこともなかろ、とも思います
し。
そういう事ですね・・・節穴ですみません・・・orz
スレ主様の回答としては、enum宣言を文字列にするのは無理で、それに対応する文字を
どこかで定義し、自分で検索するアルゴリズムを組むしかないという事で。
(←結局何も役にたってないw)
一応Banさんの回答で動くものを作っておきました。
--------------------------------------------------------------------------
// testCon.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include stdafx.h
#include <string>
#include <iostream>
class CColorEnum{
static std::wstring name[];
public:
enum Color{
RED,
BLUE,
};
static std::wstring GetName(CColorEnum::Color col)
{
return name[col];
}
std::wstring operator[](CColorEnum::Color col)
{
return name[col];
}
friend std::wostream& operator <<(std::wostream& os,
CColorEnum::Color color)
{
os << name[color];
return os;
}
};
std::wstring CColorEnum::name[] =
{
L赤,
L青,
};
int _tmain(int argc, _TCHAR* argv[])
{
CColorEnum col;
std::wcout.imbue(std::locale(japanese));
std::wcout << CColorEnum::GetName(CColorEnum::RED) <<std::endl;
std::wcout << CColorEnum::GetName(CColorEnum::BLUE) <<std::endl;
std::wcout << col[col.RED] <<std::endl;
std::wcout << col[col.BLUE] <<std::endl;
std::wcout << col.RED <<std::endl;
std::wcout << col.BLUE <<std::endl;
return 0;
}
焼肉奉行様なにをおおせられますか、大変お世話になりました
>>スレ主様の回答としては、enum宣言を文字列にするのは無理で、それに対応する文字を
>>どこかで定義し、自分で検索するアルゴリズムを組むしかないという事で。
途中で私も、薄々感じていましたが流れで、皆さんのヒントやコードがとても参考になっ
た為、ついついご好意に甘えさせて頂きました。
正直な話、恥ずかしい話ですが仕事では、限りなくCに近いC++で実装を行っているため
(勝手に変えると怒られますww)
operatorとかfriend関数などは、使ったことが無い次第なのです。
(friend関数は一回ダイアログ間でどうしても、共通の関数が使いたくて使ったかな
ぁ??)
operatorとか使うと、いかにもC++の真骨頂ってな雰囲気がしてとても、心地よかったで
す。
皆さんどうもありがとうございました。
解決とさせていただきます。
# おぉう。サンプルまで書いてる余裕なかったのですが(お仕事中…orz)、
# 焼肉奉行さんが書いてくださってた。感謝。