[解決済み] enumクラスでRange-Based Forを可能にする?
2023-05-08 20:02:34
質問
のすべてのメンバーをループするコードを繰り返し書いています。
enum class
.
は
for
ループと比べると、非常に扱いにくい印象を受けます。
range-based for
.
C++11 の新機能を利用して、現在使用している
for
ループの冗長性を削減する方法はありますか?
現在のコードで改善したいもの
enum class COLOR
{
Blue,
Red,
Green,
Purple,
First=Blue,
Last=Purple
};
inline COLOR operator++( COLOR& x ) { return x = (COLOR)(((int)(x) + 1)); }
int main(int argc, char** argv)
{
// any way to improve the next line with range-based for?
for( COLOR c=COLOR::First; c!=COLOR::Last; ++c )
{
// do work
}
return 0;
}
つまり、こんなことが出来たらいいなということです。
for( const auto& c : COLOR )
{
// do work
}
どのように解決するのですか?
列挙自体をイテレータとして列挙を繰り返すのは良くない考えで、deft_codeさんの回答のように実際のイテレータを使用することをお勧めします。しかし、これが本当に欲しいものであるなら
COLOR operator++(COLOR& x) {
return x = (COLOR)(std::underlying_type<COLOR>::type(x) + 1);
}
COLOR operator*(COLOR c) {
return c;
}
COLOR begin(COLOR r) {
return COLOR::First;
}
COLOR end(COLOR r) {
COLOR l=COLOR::Last;
return ++l;
}
int main() {
//note the parenthesis after COLOR to make an instance
for(const auto& c : COLOR()) {
//do work
}
return 0;
}
ここで働く http://ideone.com/cyTGD8
イテレータの方では、一番簡単な方法は単純に
const COLOR COLORS[] = {COLOR::Blue, COLOR::Red, COLOR::Green, COLOR::Purple};
const COLOR (&COLORREF)[(int)COLOR::Last+1] = COLORS;
int main() {
for(const auto& c : COLORS) {
//do work
}
return 0;
}
ここで見たように http://coliru.stacked-crooked.com/a/5d356cc91556d6ef
(個別の定義と配列の参照により、色数が配列の要素数と一致しない場合はコンパイラエラーとなります。優れた簡単な安全性チェックです)。
関連
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】Java:サブクラス下のenumでswitchステートメントを使用する
-
[解決済み] Javaでenumを繰り返し処理するためのforループ
-
[解決済み] String型のenumを列挙する方法は?
-
[解決済み] std::mapで範囲指定for()ループを使用するには?
-
[解決済み] C++11逆レンジベースforループ
-
[解決済み] ユーザーフレンドリーな文字列を持つEnum ToString
-
[解決済み】カスタムタイプを「範囲ベースのforループ」で動作させる方法とは?
-
[解決済み] [Solved] Range based loop: get item by value or reference to const?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 配列のベクトルを扱う正しい方法