types_is_scoped_enum (스코프 열거형 타입 판별)
std::is_scoped_enum은 주어진 타입 T가 스코프 열거형(scoped enumeration) 타입인지 컴파일 타임에 판별하는 UnaryTypeTrait예요. C++23부터 사용할 수 있고, T가 enum class 또는 enum struct로 선언된 타입이라면 value가 true가 되며, 그렇지 않으면 false가 돼요. 이 특성은 제네릭 코드에서 열거형의 종류에 따라 동작을 달리해야 할 때 유용하게 활용할 수 있어요.
출처: cppreference
본문
std::is_scoped_enum은 <type_traits> 헤더에 정의되어 있어요. 만약 프로그램에서 std::is_scoped_enum이나 std::is_scoped_enum_v에 대한 특수화를 추가하면 동작이 정의되지 않으니 주의해야 해요.
템플릿 매개변수
헬퍼 변수 템플릿
| template < class T > constexpr bool is_scoped_enum_v = is_scoped_enum < T >:: value ; |
(C++23부터) |
std::integral_constant에서 상속됨
멤버 상수
| value [static] |
T가 스코프 열거형 타입이면 true, 아니면 false (공용 정적 멤버 상수) |
멤버 함수
| operator bool |
객체를 bool로 변환하고 value를 반환해요 (공용 멤버 함수) |
| operator() (C++14) |
value를 반환해요 (공용 멤버 함수) |
멤버 타입
| Type |
Definition |
| value_type |
bool |
| type |
std :: integral_constant < bool , value > |
참고 사항
| Feature-test 매크로 |
값 |
표준 |
기능 |
| __cpp_lib_is_scoped_enum |
202011L |
(C++23) |
std::is_scoped_enum |
가능한 구현
namespace detail { void test_conversion (...); // selected when E is complete and scoped void test_conversion ( int ) = delete ; // selected when E is complete and unscoped template < class E > concept is_scoped_enum_impl = std :: is_enum_v < E > && // checked first requires { detail :: test_conversion ( E {}); }; // ill-formed before overload resolution // when E is incomplete } // namespace detail template < class T > struct is_scoped_enum : std :: bool_constant < detail :: is_scoped_enum_impl < T >> {};
예제
#include <type_traits>
static_assert(std::is_scoped_enum_v<int> == false);
class A {};
static_assert(std::is_scoped_enum_v<A> == false);
enum B { self_test = std::is_scoped_enum_v<B> };
static_assert(std::is_scoped_enum_v<B> == false);
static_assert(!self_test);
enum struct C { final, import, module };
static_assert(std::is_scoped_enum_v<C> == true);
enum class D : int { pre, post, override };
static_assert(std::is_scoped_enum_v<D> == true);
enum class E;
static_assert(std::is_scoped_enum_v<E> == true);
int main() {}
같이 보기
| is_integral (C++11) |
타입이 정수 타입인지 확인해요 (클래스 템플릿) |
| is_arithmetic (C++11) |
타입이 산술 타입인지 확인해요 (클래스 템플릿) |
| is_scalar (C++11) |
타입이 스칼라 타입인지 확인해요 (클래스 템플릿) |
| is_enum (C++11) |
타입이 열거형 타입인지 확인해요 (클래스 템플릿) |
| is_scoped_enum_type (C++26) |
리플렉션이 스코프 열거형 타입을 나타내는지 확인해요 (함수) |
더 알아보기 (Learn more)
cppreference