[C++] enum classを範囲for文でループする方法
C++のenum class
は、型安全な列挙型を提供しますが、範囲for
文で直接ループすることはできません。
これを実現するためには、enum class
のすべての値を含む配列やコンテナを用意し、それを範囲for
文でループする方法があります。
また、std::underlying_type
を使用して整数型にキャストし、範囲を指定してループする方法もあります。
これにより、enum class
の各要素に対して安全かつ効率的に操作を行うことが可能です。
- enum classの要素を取得する方法
- std::arrayを用いたループの実装方法
- std::vectorを用いたループの実装方法
- enum classの要素を文字列や整数に変換する方法
- 条件付きでenum classの要素をループする方法
enum classを範囲for文でループする方法
C++11で導入されたenum class
は、型安全な列挙型を提供します。
しかし、enum class
の要素を範囲for文でループするためには、少し工夫が必要です。
この記事では、enum class
の要素を取得し、範囲for文でループする方法を解説します。
enum classの要素を取得する方法
enum class
の要素を取得するためには、列挙型の最初と最後の要素を定義し、それを利用してループを行います。
以下に基本的な取得方法を示します。
#include <iostream>
// 色を表すenum class
enum class Color {
Red,
Green,
Blue,
// 最後の要素
Last
};
// enum classの要素を取得する関数
Color begin(Color) {
return Color::Red;
}
Color end(Color) {
return Color::Last;
}
この方法では、begin
とend関数
を定義し、範囲for文で使用できるようにします。
std::arrayを用いたループの実装
std::array
を使用することで、enum class
の要素を簡単にループすることができます。
以下にその実装例を示します。
#include <iostream>
#include <array>
// 色を表すenum class
enum class Color {
Red,
Green,
Blue,
// 最後の要素
Last
};
// enum classの要素を配列に格納
std::array<Color, 3> colors = {Color::Red, Color::Green, Color::Blue};
int main() {
for (Color color : colors) {
switch (color) {
case Color::Red:
std::cout << "Red" << std::endl;
break;
case Color::Green:
std::cout << "Green" << std::endl;
break;
case Color::Blue:
std::cout << "Blue" << std::endl;
break;
default:
break;
}
}
return 0;
}
Red
Green
Blue
この方法では、std::array
にenum class
の要素を格納し、範囲for文でループしています。
std::vectorを用いたループの実装
std::vector
を使用することで、動的にenum class
の要素を管理し、ループすることができます。
以下にその実装例を示します。
#include <iostream>
#include <vector>
// 色を表すenum class
enum class Color {
Red,
Green,
Blue,
// 最後の要素
Last
};
// enum classの要素をベクターに格納
std::vector<Color> colors = {Color::Red, Color::Green, Color::Blue};
int main() {
for (Color color : colors) {
switch (color) {
case Color::Red:
std::cout << "Red" << std::endl;
break;
case Color::Green:
std::cout << "Green" << std::endl;
break;
case Color::Blue:
std::cout << "Blue" << std::endl;
break;
default:
break;
}
}
return 0;
}
Red
Green
Blue
この方法では、std::vector
を使用してenum class
の要素を管理し、範囲for文でループしています。
ループのためのユーティリティ関数の作成
enum class
の要素をループするためのユーティリティ関数を作成することで、コードの再利用性を高めることができます。
以下にその例を示します。
#include <iostream>
#include <vector>
// 色を表すenum class
enum class Color {
Red,
Green,
Blue,
// 最後の要素
Last
};
// enum classの要素を取得するユーティリティ関数
std::vector<Color> getColors() {
return {Color::Red, Color::Green, Color::Blue};
}
int main() {
for (Color color : getColors()) {
switch (color) {
case Color::Red:
std::cout << "Red" << std::endl;
break;
case Color::Green:
std::cout << "Green" << std::endl;
break;
case Color::Blue:
std::cout << "Blue" << std::endl;
break;
default:
break;
}
}
return 0;
}
Red
Green
Blue
この方法では、getColors関数
を使用してenum class
の要素を取得し、範囲for文でループしています。
ユーティリティ関数を使用することで、コードの可読性と保守性が向上します。
応用例
enum class
を使用することで、コードの可読性と安全性を向上させることができます。
ここでは、enum class
の応用例として、要素を文字列や整数に変換する方法、条件付きでループする方法を紹介します。
enum classの要素を文字列に変換する
enum class
の要素を文字列に変換することで、デバッグやログ出力時に役立ちます。
以下にその実装例を示します。
#include <iostream>
#include <string>
// 色を表すenum class
enum class Color {
Red,
Green,
Blue
};
// enum classの要素を文字列に変換する関数
std::string toString(Color color) {
switch (color) {
case Color::Red:
return "Red";
case Color::Green:
return "Green";
case Color::Blue:
return "Blue";
default:
return "Unknown";
}
}
int main() {
Color color = Color::Green;
std::cout << "Color: " << toString(color) << std::endl;
return 0;
}
Color: Green
この方法では、toString関数
を使用してenum class
の要素を文字列に変換しています。
enum classの要素を整数に変換する
enum class
の要素を整数に変換することで、数値計算やデータベースへの保存時に役立ちます。
以下にその実装例を示します。
#include <iostream>
// 色を表すenum class
enum class Color {
Red,
Green,
Blue
};
// enum classの要素を整数に変換する関数
int toInt(Color color) {
return static_cast<int>(color);
}
int main() {
Color color = Color::Blue;
std::cout << "Color as integer: " << toInt(color) << std::endl;
return 0;
}
Color as integer: 2
この方法では、static_cast
を使用してenum class
の要素を整数に変換しています。
enum classの要素を条件付きでループする
enum class
の要素を条件付きでループすることで、特定の条件に基づいた処理を行うことができます。
以下にその実装例を示します。
#include <iostream>
#include <vector>
// 色を表すenum class
enum class Color {
Red,
Green,
Blue
};
// 条件付きでループする関数
void loopWithCondition(const std::vector<Color>& colors, Color condition) {
for (Color color : colors) {
if (color == condition) {
std::cout << "Condition met: ";
switch (color) {
case Color::Red:
std::cout << "Red" << std::endl;
break;
case Color::Green:
std::cout << "Green" << std::endl;
break;
case Color::Blue:
std::cout << "Blue" << std::endl;
break;
default:
break;
}
}
}
}
int main() {
std::vector<Color> colors = {Color::Red, Color::Green, Color::Blue};
loopWithCondition(colors, Color::Green);
return 0;
}
Condition met: Green
この方法では、loopWithCondition関数
を使用して、指定した条件に一致するenum class
の要素のみを処理しています。
条件付きでループすることで、特定の要素に対する処理を効率的に行うことができます。
よくある質問
まとめ
この記事では、C++のenum class
を範囲for文でループする方法について、具体的な実装例を通じて解説しました。
enum class
の要素を文字列や整数に変換する方法、条件付きでループする方法も紹介し、enum class
の活用法を広げる内容をお届けしました。
これらの知識を活かして、より安全で効率的なC++プログラムの開発に挑戦してみてください。