56

このように列挙型を宣言しましたが、

enum WeekEnum
{
Mon = 0;
Tue = 1;
Wed = 2;
Thu = 3;
Fri = 4;
Sat = 5;
Sun = 6;
};

アイテムの値が「0、1など」の場合、アイテム名「月、火など」を取得するにはどうすればよいですか?

私はすでにこのような機能を持っています

Log(Today is "2", enjoy! );

そして今、私は以下の出力が欲しい

今日は水曜日です、楽しんでください

4

10 に答える 10

44

直接はできませんenum。C++ では Java 列挙型とは異なります。

通常のアプローチは、std::map<WeekEnum,std::string>.

std::map<WeekEnum,std::string> m;
m[Mon] = "Monday";
//...
m[Sun] = "Sunday";
于 2012-07-30T01:06:30.340 に答える
14

いいえ、コンパイル中にすべてのシンボルが破棄されるため、C++ の値から「名前」を取得する方法はありません。

この方法が必要な場合がありますX マクロ

于 2012-07-30T01:09:05.230 に答える
8

出力を実行する演算子を定義できます。

std::ostream& operator<<(std::ostream& lhs, WeekEnum e) {
    switch(e) {
    case Monday: lhs << "Monday"; break;
    .. etc
    }
    return lhs;
}
于 2012-07-30T01:16:41.350 に答える
8

列挙は逆配列のようなものです。あなたが望むのはこれです:

const char * Week[] = { "", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };  // The blank string at the beginning is so that Sunday is 1 instead of 0.
cout << "Today is " << Week[2] << ", enjoy!";  // Or whatever you'de like to do with it.
于 2012-07-30T01:09:58.680 に答える
0

@RolandXu が指摘する X マクロに似た手法で、私は素晴らしい成功を収めました。stringize 演算子も多用しました。この手法は、アイテムが文字列と数値トークンの両方として表示されるアプリケーション ドメインがある場合のメンテナンスの悪夢を軽減します。

これは、マクロ X(...) 行を自動生成できるように、機械で読み取り可能なドキュメントが利用できる場合に特に便利です。新しいドキュメントは、文字列、列挙型、およびそれらの間で双方向に翻訳される辞書をカバーする一貫したプログラムの更新をすぐにもたらします。(私たちは PCL6 トークンを扱っていました)。

プリプロセッサ コードはかなり醜いように見えますが、これらすべての技術はヘッダー ファイルに隠されている可能性があり、二度と触れる必要がなく、ソース ファイルも同様です。すべてが型安全です。変更される唯一のものは、すべての X(...) 行を含むテキスト ファイルであり、おそらく自動生成されます。

于 2014-03-14T16:55:48.783 に答える