1)次のコードは、enum 要素 wednesdayのインデックスを示しています。インデックスの代わりに値を出力するにはどうすればよいですか。
int main()
{
enum day{sunday,monday,tuesday,wednesday,thursday,friday,saturday};
day d=wednesday;
cout<<d;
return 0;
}
2)どのような状況で、列挙型よりも匿名の列挙型を好むでしょうか
1)次のコードは、enum 要素 wednesdayのインデックスを示しています。インデックスの代わりに値を出力するにはどうすればよいですか。
int main()
{
enum day{sunday,monday,tuesday,wednesday,thursday,friday,saturday};
day d=wednesday;
cout<<d;
return 0;
}
2)どのような状況で、列挙型よりも匿名の列挙型を好むでしょうか
1)。コードは、インデックスではなく、列挙型の値を出力します。特定の例では、インデックスは値と同じです (デフォルトでは、列挙型の最初の値は数値 0 を取得し、残りは連続して増加する値を取得します。
チェックする:
int main()
{
enum day{sunday = 5,monday,tuesday,wednesday,thursday,friday,saturday};
day d=wednesday;
cout<<d; // will print 8 (as in 5 + 1 + 1 + 1)
return 0;
}
「値を出力する」が「水曜日」を出力することを意味する場合は、次のようにする必要があります。
enum day{sunday,monday,tuesday,wednesday,thursday,friday,saturday};
std::ostream& operator << (std::ostream& out, const day d)
{
static const char *as_strings[] = {"sunday", "monday",
"tuesday", "wednesday", "thursday", "friday", "saturday"
};
return out << as_strings[static_cast<int>(d)]; // this only works
// for enum values starting from 0 and being consecutive
// otherwise you should use a switch(d) and
// print each value separately
}
int main()
{
day d=wednesday;
cout<<d; // will print wednesday
return 0;
}
編集:
2)どのような状況で、列挙型よりも匿名の列挙型を好むでしょうか
パラメータとして渡す必要はないが、定数の数値に意味のある名前を割り当てる必要がある場合は、匿名の列挙型を使用します。
my_object record_to_myobject(record& r)
{
enum {id, value1, value2}; // indexes within record
int result_id = r[id]; // much more meaningful than r[0]
int result_value1 = r[value1];
int result_value2 = r[value2];
return my_object{result_id, result_value1, result_value2};
}
ここで匿名の列挙型を使用しても問題ありません。値を引数として渡す場合、列挙型ではなく int が必要だからです。列挙型が必要な場合は、名前を付ける必要があります。そうでなければ、あなたはしません。
まず、言語は内部列挙値を文字列にマッピングする手段を提供しません。それはできません。検討:
enum Numbers {
one = 1,
two = 2,
three = 3,
un = 1,
deux = 2,
trois = 3
};
列挙型定数を列挙型変数に割り当てると、数値のみが含まれます。また、上記の数値が 2 の場合、システムは にマッピングする必要があるか、 にマッピングする必要があるかをどのように判断できますtwo
かdeux
。
実際には、マッピングは多くのコンテキストで役立ちます。かなり前に、マッピング コードを生成する単純なパーサーを作成しました。C++ のほとんどを無視し、たとえば列挙型がマクロでラップされている場合は機能しません。列挙型がプライベートまたは保護されている場合、生成されたコードはコンパイルされず、上記のような場合に取得する文字列は定義されていません。 、しかし、私はまだそれが非常に便利であることを発見しました.
2 番目の質問: 通常、匿名列挙型は、列挙型の唯一の目的が定数を生成することである場合に使用されます。次のようなもの:
enum { maxSize = 4096 };
静的メンバー変数の初期化定数を提供する前に広く使用されていました。また、実際の値が何らかの符号なしの型にある場合でも、匿名の列挙型を使用してビット マスクを定義すると便利であることがよくあります。次のようなもの:
enum {
offsetMask = 0xF000,
offsetShift = 12,
NS = 0x100,
CWR = 0x80,
ECE = 0x40,
URG = 0x20,
ACK = 0x10,
// ...
};
uint16_t flags;
// ...
flags = offset << offsetShift | ACK;
列挙型を持つように変数を宣言したくありません。それらは正確に 16 ビットでなければなりません (TCP 仕様によると)。C ではおそらく a を使用し#define
、最新の C++ ではstatic uint16_t const
メンバー変数を使用する可能性がありますが、私の C++ キャリアのほとんどを通して、上記のようなものが通常の解決策でした。
このテーマのタイプセーフなバリエーションは、enum class
それをキーとして使用して使用することですstd::map
#include <string>
#include <map>
#include <iostream>
int main()
{
enum class day
{
sunday,
monday,
tuesday,
wednesday,
thursday,
friday,
saturday
};
std::map<day,std::string> days =
{
std::make_pair(day::sunday, "Sunday"),
std::make_pair(day::monday, "Monday"),
std::make_pair(day::tuesday, "Tuesday"),
std::make_pair(day::wednesday, "Wednesday"),
std::make_pair(day::thursday, "Thursday"),
std::make_pair(day::friday, "Friday"),
std::make_pair(day::saturday, "Saturday")
};
std::cout << days[day::sunday] << std::endl;
}
これは、整数型でマップにアクセスするとコンパイル エラーが発生することを意味します。
列挙値の文字列「説明」の配列を手動で維持する必要がありますが、これは面倒でエラーが発生しやすいものです。
static const char *daydescs[] = {
"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"
};
int main()
{
enum day{sunday,monday,tuesday,wednesday,thursday,friday,saturday};
day d=wednesday;
cout<< daydescs[(unsigned)d];
return 0;
}
enum は数値であり、文字列表現 (例: wednesday) はコンパイル時の表現です。
次のようなものが必要です。
const char *dayname[] = {"sunday","monday","tuesday","wednesday","thursday","friday","saturday"};
...
cout << dayname[(unsigned)d];
...