Namespaces
Variants

Extensions for reflection

From cppreference.net
Extensions for reflection
Concepts
Meta-object operations
Variable
FunctionParameter
Callable
Variable and Callable
Namespace and Callable
ParenthesizedExpression
FunctionCallExpression
FunctionalConversion
Variable and Function

C++ 확장 리플렉션, ISO/IEC TS 23619:2021은 핵심 언어에 대한 수정 사항을 명시하고 이 페이지에 나열된 C++ 표준 라이브러리의 새로운 구성 요소들을 정의합니다.

Reflection TS는 C++20 표준을 기반으로 합니다(단, 개념의 정의는 Concepts TS 스타일로 명시되어 있습니다).

목차

핵심 언어 변경사항

reflexpr-지정자

reflexpr-specifier reflexpr ( reflexpr-operand ) 형태를 가지며, 메타 객체 타입을 지정합니다(아래 참조).

reflexpr-operand 은 다음 중 하나일 수 있습니다:

:: (1)
type-id (2)
nested-name-specifier (optional) namespace-name (3)
id-expression (4)
( expression ) (5)
function-call-expression (6)
functional-type-conv-expression (7)

여기서 function-call-expression

postfix-expression ( expression-list (선택적) )

그리고 functional-type-conv-expression 는 다음과 같은 종류의 표현식으로 명시적 캐스트 를 수행합니다:

단순-타입-지정자 ( 표현식-목록 (선택적) ) (1)
타입이름-지정자 ( 표현식-목록 (선택적) ) (2)
단순-타입-지정자 중괄호-초기화-목록 (3)
타입이름-지정자 중괄호-초기화-목록 (4)

reflexpr-specifier 의 피연산자는 type , namespace , enumerator , variable, data member , function parameter , captured entity , function-call-expression 또는 functional-type-conv-expression , 그리고 괄호로 묶인 표현식이어야 합니다. reflexpr ( :: ) 는 전역 네임스페이스를 반영합니다.

reflexpr-operand ( expression ) 형태일 경우, expression 은 (여러 괄호로 둘러싸일 수 있는) function-call-expression 또는 functional-type-conv-expression 이어야 합니다.

괄호로 묶이지 않은 피연산자가 type-id 또는 functional-type-conv-expression 로 해석될 수 있는 경우, 이는 type-id 로 처리됩니다. 함수 스타일 캐스트와 type-id 사이의 모호성을 해소하기 위해 괄호를 사용할 수 있습니다. 예를 들어, 기본 생성자를 가진 클래스 타입 X 가 주어졌을 때, reflexpr ( X ( ) ) 는 함수 타입 X ( ) 를 반영하고, reflexpr ( ( X ( ) ) ) 는 표현식 X ( ) 를 반영합니다.

피연산자가 별칭과 클래스 이름을 모두 지정하는 경우, reflexpr 지정자가 나타내는 타입은 별칭을 반영하며 reflect::Alias 를 충족합니다.

피연산자가 블록 범위 내에 선언된 이름을 지정하고, 해당 명명된 개체가 캡처되지도 않았고 함수 매개변수도 아닌 경우, 프로그램은 형식에 맞지 않습니다.

메타 객체 타입

메타 객체 타입 은 이름 없는 불완전한 네임스페이스 범위 클래스 타입입니다. reflect::Object 개념은 해당 타입이 메타 객체 타입인 경우에만 만족됩니다. 메타 객체 타입은 reflexpr 의 피연산자에 따라 다른 개념들도 만족할 수 있습니다.

동일한 피연산자에 반복적으로 reflexpr 를 적용했을 때 동일한 타입이 반환되는지 다른 타입이 반환되는지는 명시되지 않았습니다. 메타-객체 타입이 불완전한 클래스 타입을 반영하는 경우, 특정 타입 변환을 적용할 수 없습니다.

메타 객체 타입은 reflexpr 피연산자의 일부 속성을 타입 특성이나 타입 변환을 통해 검사할 수 있도록 합니다.

오버로드 해결

만약 postfix-expression 이 클래스 타입인 경우, 즉 function-call-expression e function-call-expression e ( args ) 에서 클래스 타입인 경우, postfix-expression ( e )의 타입에 대한 user-defined conversion function 은 사용되어서는 안 됩니다.

만약 postfix-expression 이 클래스 타입이 아니라면, 이는 오버로드 해결의 유일한 결과인 함수를 지정해야 합니다.

struct Functor
{
    void operator()(int) const;
    using fptr_t = void(*)(std::nullptr_t);
    operator fptr_t() const;
};
using Meta0 = reflexpr(Functor{}(0));          // 정상
// using Meta1 = reflexpr(Functor{}(nullptr)); // 오류: 변환 함수 사용됨

리플렉션 관련

alias typedef 선언, alias-declaration , 또는 using-declaration 으로 도입된 이름입니다.

엔티티(entity) 또는 별칭(alias) B 가 엔티티 또는 별칭 A 에 대해 리플렉션 관련(reflection-related) 이라고 하는 조건은 다음과 같습니다:

  1. A B 가 동일한 개체 또는 별칭인 경우,
  2. A 가 변수나 열거자이고 B A 의 타입인 경우,
  3. A 가 열거형이고 B A 의 기반 타입인 경우,
  4. A 가 클래스이고 B A 의 멤버 또는 기본 클래스인 경우,
  5. A B 개체를 지정하는 비템플릿 별칭인 경우,
  6. A 가 전역 네임스페이스가 아니고 B A 를 포함하는 클래스나 네임스페이스인 경우,
  7. A 가 괄호로 묶인 표현식 ( B )인 경우,
  8. A 가 클로저 타입 B 의 람다 캡처인 경우,
  9. A 가 람다 캡처 B 의 클로저 타입인 경우,
  10. B functional-type-conv-expression A 에 의해 지정된 타입인 경우,
  11. B function-call-expression A 에 대한 오버로드 해결로 선택된 함수인 경우,
  12. B 가 함수 A 의 반환 타입, 매개변수 타입, 또는 함수 타입인 경우, 또는
  13. B 가 개체 또는 별칭 X 와 리플렉션 관련이 있고 X A 와 리플렉션 관련이 있는 경우.

반사-관계 관계는 반사적이고 이행적이지만, 대칭적이지 않습니다.

비공식적으로 말하자면, B A 와 리플렉션 관련이 있다는 것은 B A 의 선언 또는 정의에 참여한다는 것을 의미합니다.

reflexpr-specifier 로 표시된 타입에 메타-객체 타입을 생성하는 타입 변환을 0회 이상 연속적으로 적용하면, 피연산자와 리플렉션 관련된 엔티티와 별칭을 검사할 수 있습니다; 이러한 메타-객체 타입은 해당 리플렉션 관련 엔티티나 별칭을 반영한다고 합니다.

struct X;
struct B
{
    using X = ::X;
    typedef X Y;
};
struct D : B
{
    using B::Y;
};
// ::X만이 D::Y와 리플렉션 관련이 있으며, B::X나 B::Y는 관련이 없음

기타

키워드

reflexpr

미리 정의된 기능 테스트 매크로

__cpp_reflection
(reflection TS)
최소 201902 값은 Reflection TS가 지원됨을 나타냅니다
(매크로 상수)

라이브러리 지원

개념

헤더에 정의됨 <experimental/reflect>
네임스페이스에 정의됨 std::experimental::reflect
인라인 네임스페이스에 정의됨 std::experimental::reflect::v1
(reflection TS)
메타-객체 타입인 타입을 명시함
(concept)
(reflection TS)
메타 객체 타입이 메타 객체 시퀀스 타입임을 명시함
(concept)
(reflection TS)
메타 객체 타입이 템플릿 매개변수 스코프를 반영함을 지정
(concept)
(reflection TS)
메타 객체 타입이 연관된 (빈 값일 수도 있는) 이름을 가진 엔티티나 별칭을 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 타입 별칭, 네임스페이스 별칭 또는 using 선언으로 도입된 별칭을 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 클래스의 member-declaration 을 반영함을 지정함
(concept)
(reflection TS)
메타 객체 타입이 열거자를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 변수나 데이터 멤버를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 RecordMember , Enumerator , 또는 Variable 를 만족하거나, 글로벌 네임스페이스 이외의 네임스페이스를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 타입을 가진 엔티티를 반영함을 지정함
(concept)
(reflection TS)
메타 객체 타입이 네임스페이스를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 전역 네임스페이스를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 비-유니온 클래스 타입을 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 열거형 타입을 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 클래스 타입을 반영함을 지정함
(concept)
(reflection TS)
메타 객체 타입이 네임스페이스, 클래스, 열거형, 함수, 클로저 타입, 템플릿 매개변수 스코프를 반영함을 지정
(concept)
(reflection TS)
메타 객체 타입이 타입을 반영함을 지정함
(concept)
(reflection TS)
메타 객체 타입이 열거자 또는 constexpr 변수를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 get_base_classes 로부터 얻은 직접 기본 클래스를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 함수 매개변수를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 함수(생성자와 소멸자 포함)를 반영함을 명시
(concept)
(reflection TS)
메타 객체 타입이 표현식을 반영함을 명시
(concept)
메타 객체 타입이 괄호로 묶인 표현식을 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 function-call-expression 를 반영한다는 것을 명시함
(concept)
메타 객체 타입이 functional-type-conv-expression 을 반영한다는 것을 명시합니다
(concept)
(reflection TS)
메타 객체 타입이 함수(생성자와 소멸자 제외)를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 멤버 함수(생성자와 소멸자 제외)를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 특별 멤버 함수를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 생성자를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 소멸자를 반영함을 지정
(concept)
(reflection TS)
메타 객체 타입이 연산자 함수 또는 변환 함수를 반영함을 지정함
(concept)
(reflection TS)
메타 객체 타입이 변환 함수를 반영함을 지정합니다
(concept)
(reflection TS)
메타 객체 타입이 비제네릭 람다의 클로저 타입을 반영함을 지정
(concept)
(reflection TS)
메타 객체 타입이 람다 캡처를 반영함을 지정
(concept)

메타 객체 연산

헤더에 정의됨 <experimental/reflect>
네임스페이스에 정의됨 std::experimental::reflect
인라인 네임스페이스에 정의됨 std::experimental::reflect::v1
Object operations
(reflection TS)
두 메타-객체 타입이 동일한 엔티티나 별칭을 반영하는지 확인합니다
(클래스 템플릿)
(reflection TS)
반사된 엔티티 또는 별칭의 선언이 위치한 추정된 줄 번호를 획득함
(클래스 템플릿)
(reflection TS)
반사된 엔티티 또는 별칭의 선언에 대한 구현 정의 열 번호를 획득함
(클래스 템플릿)
(reflection TS)
반사된 엔티티 또는 별칭의 선언이 위치한 추정 파일 이름을 획득
(클래스 템플릿)
ObjectSequence 연산
(reflection TS)
메타 객체 시퀀스의 크기를 획득함
(클래스 템플릿)
(reflection TS)
시퀀스 내 지정된 인덱스를 가진 메타-객체 타입을 획득함
(클래스 템플릿)
(reflection TS)
메타 객체 시퀀스에 템플릿을 적용함
(클래스 템플릿)
Named 연산
(reflection TS)
반사된 개체 또는 별칭이 이름 없는지 확인합니다
(클래스 템플릿)
(reflection TS)
반사된 엔티티 또는 별칭의 비한정 이름을 획득함
(클래스 템플릿)
(reflection TS)
반사된 엔티티나 별칭의 구현 정의 디스플레이 이름을 획득함
(클래스 템플릿)
Alias operations
(reflection TS)
반사된 별칭의 연관된 엔티티를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿)
Type 타입 연산
(reflection TS)
반사된 엔티티나 별칭의 타입을 반영하는 메타 객체 타입을 획득함
(클래스 템플릿)
(reflection TS)
반사된 엔티티 또는 별칭의 타입을 획득함
(클래스 템플릿)
(reflection TS)
메타 객체 타입이 열거형 타입을 반영하는지 검사합니다
(클래스 템플릿)
(reflection TS)
메타 객체 타입이 union 타입을 반영하는지 검사합니다
(클래스 템플릿)
메타 객체 타입이 각각 class 또는 struct 키워드를 사용하여 선언된 비-공용체 클래스 타입을 반영하는지 검사합니다
(클래스 템플릿)
ScopeMember operations
(reflection TS)
반사된 엔티티 또는 별칭의 범위를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿)
Base operations
(reflection TS)
주어진 기본 클래스 관계에서 기본 클래스를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿)
RecordMember Base 연산
(reflection TS)
반사된 멤버 또는 기본 클래스가 public인지 확인합니다
(클래스 템플릿)
(reflection TS)
리플렉션된 멤버 또는 기본 클래스가 protected인지 확인합니다
(클래스 템플릿)
(reflection TS)
리플렉션된 멤버 또는 기본 클래스가 private인지 확인합니다
(클래스 템플릿)
Record 작업
반사된 클래스의 public, 접근 가능, 또는 모든 데이터 멤버를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿)
반영된 클래스의 public, 접근 가능, 또는 모든 멤버 함수들을 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿)
(reflection TS)
반영된 클래스의 모든 생성자를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿)
(reflection TS)
반영된 클래스에서 선언된 모든 연산자 함수와 변환 함수를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿)
(reflection TS)
리플렉션된 클래스의 소멸자를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿)
반영된 클래스의 public, 접근 가능, 또는 모든 중첩 타입 또는 멤버 typedef를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿)
반영된 클래스의 public, 접근 가능한, 또는 모든 기본 클래스들을 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿)
Enum 연산
(reflection TS)
반사된 열거형이 범위 지정 열거형인지 확인합니다
(클래스 템플릿)
(reflection TS)
반사된 열거형의 열거자를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿)
(reflection TS)
반사된 열거형의 기반 타입을 반영하는 메타 객체 타입을 획득함
(클래스 템플릿)
Variable 변수 연산
(reflection TS)
상수 표현식인 반영된 변수의 값을 획득함
(클래스 템플릿)
(reflection TS)
변수가 thread_local 로 선언되었는지 확인합니다
(클래스 템플릿)
FunctionParameter 연산
(reflection TS)
리플렉션된 매개변수가 기본 인수를 가지는지 여부를 검사합니다
(클래스 템플릿)
Callable operations
(reflection TS)
반사된 함수의 매개변수를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿)
(reflection TS)
반사된 함수의 매개변수 목록이 생략 부호 매개변수를 포함하는지 여부를 확인합니다
(클래스 템플릿)
(reflection TS)
리플렉트된 함수가 non-throwing인지 검사합니다
(클래스 템플릿)
(reflection TS)
리플렉션된 함수가 삭제되었는지 확인합니다
(클래스 템플릿)
Variable Callable 연산
(reflection TS)
반사된 변수 또는 함수가 constexpr인지 검사합니다
(클래스 템플릿)
Namespace Callable 연산
(reflection TS)
리플렉션된 네임스페이스나 함수가 인라인인지 확인합니다
(클래스 템플릿)
ParenthesizedExpression 연산
(reflection TS)
반사된 괄호식의 괄호 없는 표현식을 반영하는 메타 객체 타입을 획득함
(클래스 템플릿)
FunctionCallExpression 연산
(reflection TS)
반사된 function-call-expression 에서 함수를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿)
FunctionalTypeConversion 연산
(reflection TS)
반사된 functional-type-conv-expression 에서 생성자를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿)
Variable Function 연산
(reflection TS)
반사된 변수나 함수의 주소를 얻거나, 반사된 비정적 멤버에 대한 멤버 포인터 값을 얻음
(클래스 템플릿)
MemberFunction 연산
리플렉션된 멤버 함수가 각각 const , volatile , & , 또는 && 한정자로 선언되었는지 확인합니다
(클래스 템플릿)
(reflection TS)
리플렉션된 멤버 함수가 기본 클래스의 멤버 함수를 오버라이드하는지 확인합니다
(클래스 템플릿)
Record MemberFunction 연산
(reflection TS)
반사된 클래스 또는 멤버 함수가 final 으로 표시되었는지 확인합니다
(클래스 템플릿)
Variable MemberFunction 연산
(reflection TS)
반사된 변수가 정적 저장 기간을 가지는지, 또는 반사된 멤버 함수가 정적인지 검사합니다
(클래스 템플릿)
SpecialMemberFunction 연산
(reflection TS)
리플렉션된 특수 멤버 함수가 암시적으로 선언되었는지 확인합니다
(클래스 템플릿)
(reflection TS)
반영된 특별 멤버 함수가 첫 번째 선언에서 기본값으로 지정되었는지 확인합니다
(클래스 템플릿)
Constructor ConversionOperator 연산
(reflection TS)
반사된 생성자 또는 변환 함수가 explicit 로 선언되었는지 확인합니다
(클래스 템플릿)
MemberFunction Destructor 연산
(reflection TS)
반사된 멤버 함수가 가상 함수인지 확인합니다
(클래스 템플릿)
(reflection TS)
리플렉션된 멤버 함수가 순수 가상 함수인지 확인합니다
(클래스 템플릿)
Lambda 연산
(reflection TS)
반사된 클로저 타입의 캡처들을 반영하는 메타-객체 시퀀스 타입을 획득함
(클래스 템플릿)
반사된 클로저 타입의 람다 표현식의 캡처 기본값이 각각 = 또는 & 인지 확인합니다
(클래스 템플릿)
(reflection TS)
반사된 클로저 타입의 operator() const 로 선언되었는지 확인합니다
(클래스 템플릿)
LambdaCapture 연산
(reflection TS)
리플렉션된 람다 캡처가 명시적으로 캡처되었는지 확인합니다
(클래스 템플릿)
(reflection TS)
반사된 람다 캡처가 초기화 캡처인지 확인합니다
(클래스 템플릿)

라이브러리 기능 테스트 매크로

헤더 파일에 정의됨 <experimental/reflect>
__cpp_lib_reflection
(reflection TS)
최소 201902 값은 Reflection TS의 지원 라이브러리가 지원됨을 나타냅니다
(매크로 상수)

개념 충족

다음 표는 피연산자를 반영하는 메타-객체 타입이 Reflection TS에서 도입한 개념들을 만족하는지 여부를 나열합니다.

카테고리 reflexpr 피연산자 충족하는 개념
타입 class-name designating a union reflect::Union
class-name designating a closure type reflect::Lambda
class-name designating a non-union class reflect::Record
enum-name reflect::Enum
template type-parameter reflect::Type , reflect::Alias
decltype-specifier reflect::Type , reflect::Alias
type-name introduced by a using-declaration reflect::Type , reflect::Alias , reflect::ScopedMember
any other typedef-name reflect::Type , reflect::Alias
any other type-id reflect::Type
네임스페이스 namespace-alias reflect::Namespace , reflect::Alias
the global namespace reflect::GlobalScope
any other namespace reflect::Namespace
표현식 the name of a data member reflect::Variable
the name of a variable reflect::Variable
the name of an enumerator reflect::Enumerator
the name of a function parameter reflect::FunctionParameter
the name of a captured entity reflect::LambdaCapture
parenthesized expression reflect::ParenthesizedExpression
function-call-expression reflect::FunctionCallExpression
functional-type-conv-expression reflect::FunctionalTypeConversion

id-expression 형태의 피연산자가 상수 표현식인 경우, reflexpr-specifier로 지정된 타입은 또한 reflect::Constant 를 만족합니다.

만약 reflexpr-피연산자가 클래스 멤버를 지정한다면, reflexpr-지시자로 표현되는 타입은 또한 reflect::RecordMember 를 만족합니다.

참고 항목

일부 타입의 정보를 포함하며, typeid 연산자가 반환하는 클래스
(클래스)
컴파일 타임 타입 정보 유틸리티