728x90
반응형
질문 : 최신 C ++ 11 / C ++ 14 / C ++ 17 및 향후 C ++ 20에서 열거 형 문자열
- 2008 c C ++ 열거 형을 문자열로 변환하는 간단한 방법이 있습니까?
- 2008 c C에서 enum 유형의 변수를 문자열로 사용하는 쉬운 방법?
- 2008 C ++ C ++ 열거 형을 문자열에 쉽게 매핑하는 방법
- 2008 C ++ 무언가를 C 식별자와 문자열로 만드는가?
- 2008 C ++ C ++ 열거 형을 문자열로 변환하는 간단한 스크립트가 있습니까?
- 2009 C ++ C ++에서 열거 형을 플래그로 사용하는 방법은 무엇입니까?
- 2011 C ++ 열거 형 변수를 문자열로 변환하는 방법은 무엇입니까?
- 2011 C ++ 열거 형에서 문자열로 C ++
- 2011 C ++ 열거 형 변수를 문자열로 변환하는 방법은 무엇입니까?
- 2012 c c에서 열거 형 이름을 문자열로 변환하는 방법
- 2013 c C에서 조건부로 컴파일 된 열거 형 문자열 화
예는 종종 긴 설명보다 낫습니다.
Coliru 에서이 스 니펫을 컴파일하고 실행할 수 있습니다.
( 다른 이전 예도 사용할 수 있습니다)
#include <map>
#include <iostream>
struct MyClass
{
enum class MyEnum : char {
AAA = -8,
BBB = '8',
CCC = AAA + BBB
};
};
// Replace magic() by some faster compile-time generated code
// (you're allowed to replace the return type with std::string
// if that's easier for you)
const char* magic (MyClass::MyEnum e)
{
const std::map<MyClass::MyEnum,const char*> MyEnumStrings {
{ MyClass::MyEnum::AAA, "MyClass::MyEnum::AAA" },
{ MyClass::MyEnum::BBB, "MyClass::MyEnum::BBB" },
{ MyClass::MyEnum::CCC, "MyClass::MyEnum::CCC" }
};
auto it = MyEnumStrings.find(e);
return it == MyEnumStrings.end() ? "Out of range" : it->second;
}
int main()
{
std::cout << magic(MyClass::MyEnum::AAA) <<'\n';
std::cout << magic(MyClass::MyEnum::BBB) <<'\n';
std::cout << magic(MyClass::MyEnum::CCC) <<'\n';
}
- 다른 답변 이나 기본 링크를 무가치하게 복제하지 마십시오.
- 부풀어 오른 매크로 기반 답변을 피하거나
#define
오버 헤드를 가능한 최소한으로 줄이십시오. enum
->string
매핑을 사용하지 마십시오.
- 0이 아닌 숫자로 시작하는
enum
값 지원 - 음수
enum
값 지원 - 조각난
enum
값 지원 - 지원
class enum
(C ++ 11) - 지원
class enum : <type>
허용되는<type>
(C ++ 11) - 컴파일 시간 (런타임 아님)을 문자열로 변환,
또는 적어도 런타임에 빠른 실행 (예 :std::map
은 좋은 생각이 아닙니다 ...) constexpr
(C ++ 11, C ++ 14 / 17 / 20에서 완화됨)noexcept
(C ++ 11)- C ++ 17 / C ++ 20 친화적 스 니펫
variadic template class
및 constexpr
함수를 기반으로하는 메타 프로그래밍 트릭을 사용하여 컴파일시 C ++ 코드를 생성 할 수 있습니다.
답변
#include <magic_enum.hpp>
enum Color { RED = 2, BLUE = 4, GREEN = 8 };
Color color = Color::RED;
auto color_name = magic_enum::enum_name(color);
// color_name -> "RED"
std::string color_name{"GREEN"};
auto color = magic_enum::enum_cast<Color>(color_name)
if (color.has_value()) {
// color.value() -> Color::GREEN
};
더 많은 예제를 보려면 홈 저장소 https://github.com/Neargye/magic_enum을 확인하십시오.
이 라이브러리는 Clang> = 5, MSVC> = 15.3 및 GCC> = 9에서 작동하는 컴파일러 관련 해킹 ( __PRETTY_FUNCTION__
/ __FUNCSIG__
열거 형 값은 [MAGIC_ENUM_RANGE_MIN, MAGIC_ENUM_RANGE_MAX]
범위 내에 있어야합니다.
- 기본적으로
MAGIC_ENUM_RANGE_MIN = -128
,MAGIC_ENUM_RANGE_MAX = 128
. - 기본적으로 모든 열거 형 유형에 대해 다른 범위가 필요한 경우
MAGIC_ENUM_RANGE_MIN
및MAGIC_ENUM_RANGE_MAX
매크로를 재정의하십시오. MAGIC_ENUM_RANGE_MIN
0
보다 작거나 같아야하며INT16_MIN
보다 커야합니다.MAGIC_ENUM_RANGE_MAX
는0
보다 크고INT16_MAX
보다 작아야합니다.- 특정 열거 형 유형에 대해 다른 범위가 필요한 경우 필요한 열거 형 유형에 대한 전문화 enum_range를 추가합니다.
#include <magic_enum.hpp>
enum number { one = 100, two = 200, three = 300 };
namespace magic_enum {
template <>
struct enum_range<number> {
static constexpr int min = 100;
static constexpr int max = 300;
};
}
출처 : https://stackoverflow.com/questions/28828957/enum-to-string-in-modern-c11-c14-c17-and-future-c20
728x90
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C ++에서 구조체와 클래스의 차이점 (0) | 2021.06.29 |
---|---|
C ++ 표준은 초기화되지 않은 bool이 프로그램을 충돌시키는 것을 허용할까? (0) | 2021.06.27 |
C ++에서 'struct'와 'typedef struct'의 차이점 (0) | 2021.06.26 |
C ++에서 배열 사용 방법 (0) | 2021.06.25 |
C ++에서 문자열을 토큰화 하는 방법 (0) | 2021.06.23 |