Modern C++에서는 열거형(enumerator)의 타입 안전성과 편의성을 강화하기 위해 enum class
를 도입했습니다.
또한, 반복(iteration
)이나 문자열 변환 같은 작업을 더 효과적으로 수행할 수 있는 기법도 지원됩니다.
본 글에서는 enum class
의 특징, 활용법, 반복자 구현, 문자열 변환, 그리고 C++20 이후의 Reflection
기반 작업에 대해 다룹니다.
기존의 C 스타일 enum
은 암시적으로 정수형으로 변환될 수 있으며, 네임스페이스 내에서 이름 충돌이 발생할 가능성이 있습니다.
cpp
// Modern C++ 이전 enum
enum Color { Red, Green, Blue }; // 암시적으로 정수형
Color c = Red;
int value = c; // 암시적 변환 허용
- Modern C++의
enum class
는 타입 안전 과 스코프 분리 를 제공합니다!
cpp
// Modern C++ enum class
enum class Color { Red, Green, Blue };
Color c = Color::Red; // 명시적으로 접근 필요
int value = static_cast<int>(c); // 명시적 변환 필요
enum class
는 저장 타입을 명시적으로 지정할 수 있어 메모리 사용을 최적화하거나 특정 크기 요구 사항을 만족시킬 수 있습니다.
cpp
enum class Color : uint8_t { Red, Green, Blue };
C++은 열거형 요소를 자동으로 반복하는 기능을 내장하지 않지만, std::array
와 사용자 정의 반복자를 활용해 이를 구현할 수 있습니다.
cpp
#include <iostream>
#include <array>
enum class Color { Red, Green, Blue, Count };
std::ostream& operator<<(std::ostream& os, Color color) {
switch (color) {
case Color::Red: return os << "Red";
case Color::Green: return os << "Green";
case Color::Blue: return os << "Blue";
default: return os << "Unknown";
}
}
int main() {
for (int i = 0; i < static_cast<int>(Color::Count); ++i) {
std::cout << static_cast<Color>(i) << '\n';
}
return 0;
}
열거형을 문자열로 변환하는 기능은 C++ 표준에 포함되지 않았으므로 보통 매크로나 사용자 정의 함수를 사용합니다.
cpp
#define ENUM_TO_STRING_CASE(x) case x: return #x;
const char* ToString(Color color) {
switch (color) {
ENUM_TO_STRING_CASE(Color::Red)
ENUM_TO_STRING_CASE(Color::Green)
ENUM_TO_STRING_CASE(Color::Blue)
default: return "Unknown";
}
}
C++20 이후에는 Reflection 관련 라이브러리(magic_enum
등)를 활용해 열거형 요소를 더 쉽게 탐색하거나 변환할 수 있습니다.
cpp
#include <magic_enum.hpp>
#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
for (auto color : magic_enum::enum_values<Color>()) {
std::cout << magic_enum::enum_name(color) << '\n';
}
return 0;
}
이 라이브러리를 사용하면 열거형 반복, 문자열 변환, 요소 이름 탐색이 간단해집니다.
-
C++ 공식 문서
-
Reflection 기반 라이브러리
-
Modern C++ 자료
-
C++ 리플렉션(Reflection)
이 글은 Modern C++에서 열거형 작업을 최적화하고 코드의 가독성을 높이는 방법을 제안합니다.
다양한 라이브러리와 문서를 참고해 더 깊이 있는 개발 환경을 구축해보세요! 👍
'C C++' 카테고리의 다른 글
NVidia GPU CUDA 블록/스레드 활용 방안 (0) | 2024.11.27 |
---|---|
템플릿 메타프로그래밍 (TMP,Template Metaprogramming) (1) | 2024.11.24 |
C++ 리플렉션(Reflection) (1) | 2024.11.20 |
거짓 공유(False Sharing) 방지 (0) | 2024.11.19 |
커스텀 얼로케이터 (Custom Allocator) (0) | 2024.11.19 |