Extensions for reflection
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)
이라고 하는 조건은 다음과 같습니다:
-
A와B가 동일한 개체 또는 별칭인 경우, -
A가 변수나 열거자이고B가A의 타입인 경우, -
A가 열거형이고B가A의 기반 타입인 경우, -
A가 클래스이고B가A의 멤버 또는 기본 클래스인 경우, -
A가B개체를 지정하는 비템플릿 별칭인 경우, -
A가 전역 네임스페이스가 아니고B가A를 포함하는 클래스나 네임스페이스인 경우, -
A가 괄호로 묶인 표현식 (B)인 경우, -
A가 클로저 타입B의 람다 캡처인 경우, -
A가 람다 캡처B의 클로저 타입인 경우, -
B가 functional-type-conv-expressionA에 의해 지정된 타입인 경우, -
B가 function-call-expressionA에 대한 오버로드 해결로 선택된 함수인 경우, -
B가 함수A의 반환 타입, 매개변수 타입, 또는 함수 타입인 경우, 또는 -
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-operand 로 사용되는 표현식은 평가되지 않는 표현식(unevaluated expressions) 이며 잠재적으로 상수 평가됨(potentially constant evaluated) 입니다.
-
캡처 기본값(capture-default)에 의해
람다 표현식에서 캡처되는 변수
의 결정을 목적으로 할 때,
reflexpr피연산자는 평가되지 않는 피연산자로 간주되지 않습니다. -
정적
저장 기간(storage duration)
을 가지는 함수 또는 변수가 메타 객체 타입
T로 반사될 때, 해당 함수나 변수의 주소를 취하는 것처럼 std :: experimental :: reflect :: get_pointer < T > 특수화에 의해 ODR-사용(odr-used) 됩니다. - 이 타입에 대한 모든 연산이 동일한 상수 표현식 결과를 생성하는 한, 메타 객체 타입의 정의가 여러 개 존재할 수 있습니다.
-
타입은 reflexpr-지정자로 표시되고 피연산자가 다음 중 하나일 경우
의존적(dependent)
입니다:
- 타입 의존적 표현식(type-dependent expression) 이거나, 적어도 하나의 타입 의존적 직접 하위 표현식을 포함하는 (괄호로 둘러싸일 수 있는) 함수형 변환 표현식(functional-type-conv-expression) 인 경우, 또는
- 의존적 타입이나 알려지지 않은 특수화(unknown specialization) 의 멤버, 또는 값 의존적 상수 표현식(value-dependent constant expression) 을 지정하는 경우.
키워드
미리 정의된 기능 테스트 매크로
|
__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) |
|
(reflection TS)
|
메타 객체 타입이 괄호로 묶인 표현식을 반영함을 지정합니다
(concept) |
|
(reflection TS)
|
메타 객체 타입이
function-call-expression
를 반영한다는 것을 명시함
(concept) |
|
(reflection TS)
|
메타 객체 타입이
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
|
|
|
|
|
(reflection TS)
|
두 메타-객체 타입이 동일한 엔티티나 별칭을 반영하는지 확인합니다
(클래스 템플릿) |
|
(reflection TS)
|
반사된 엔티티 또는 별칭의 선언이 위치한 추정된 줄 번호를 획득함
(클래스 템플릿) |
|
(reflection TS)
|
반사된 엔티티 또는 별칭의 선언에 대한 구현 정의 열 번호를 획득함
(클래스 템플릿) |
|
(reflection TS)
|
반사된 엔티티 또는 별칭의 선언이 위치한 추정 파일 이름을 획득
(클래스 템플릿) |
|
|
|
(reflection TS)
|
메타 객체 시퀀스의 크기를 획득함
(클래스 템플릿) |
|
(reflection TS)
|
시퀀스 내 지정된 인덱스를 가진 메타-객체 타입을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
메타 객체 시퀀스에 템플릿을 적용함
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 개체 또는 별칭이 이름 없는지 확인합니다
(클래스 템플릿) |
|
(reflection TS)
|
반사된 엔티티 또는 별칭의 비한정 이름을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
반사된 엔티티나 별칭의 구현 정의 디스플레이 이름을 획득함
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 별칭의 연관된 엔티티를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 엔티티나 별칭의 타입을 반영하는 메타 객체 타입을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
반사된 엔티티 또는 별칭의 타입을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
메타 객체 타입이 열거형 타입을 반영하는지 검사합니다
(클래스 템플릿) |
|
(reflection TS)
|
메타 객체 타입이 union 타입을 반영하는지 검사합니다
(클래스 템플릿) |
|
(reflection TS)
|
메타 객체 타입이 각각
class
또는
struct
키워드를 사용하여 선언된 비-공용체 클래스 타입을 반영하는지 검사합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 엔티티 또는 별칭의 범위를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿) |
|
|
|
(reflection TS)
|
주어진 기본 클래스 관계에서 기본 클래스를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 멤버 또는 기본 클래스가 public인지 확인합니다
(클래스 템플릿) |
|
(reflection TS)
|
리플렉션된 멤버 또는 기본 클래스가 protected인지 확인합니다
(클래스 템플릿) |
|
(reflection TS)
|
리플렉션된 멤버 또는 기본 클래스가 private인지 확인합니다
(클래스 템플릿) |
|
|
|
반사된 클래스의 public, 접근 가능, 또는 모든 데이터 멤버를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿) |
|
|
반영된 클래스의 public, 접근 가능, 또는 모든 멤버 함수들을 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿) |
|
|
(reflection TS)
|
반영된 클래스의 모든 생성자를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
반영된 클래스에서 선언된 모든 연산자 함수와 변환 함수를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
리플렉션된 클래스의 소멸자를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿) |
|
반영된 클래스의 public, 접근 가능, 또는 모든 중첩 타입 또는 멤버 typedef를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿) |
|
|
반영된 클래스의 public, 접근 가능한, 또는 모든 기본 클래스들을 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿) |
|
|
|
|
(reflection TS)
|
반사된 열거형이 범위 지정 열거형인지 확인합니다
(클래스 템플릿) |
|
(reflection TS)
|
반사된 열거형의 열거자를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
반사된 열거형의 기반 타입을 반영하는 메타 객체 타입을 획득함
(클래스 템플릿) |
|
|
|
(reflection TS)
|
상수 표현식인 반영된 변수의 값을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
변수가
thread_local
로 선언되었는지 확인합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
리플렉션된 매개변수가 기본 인수를 가지는지 여부를 검사합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 함수의 매개변수를 반영하는 메타 객체 시퀀스 타입을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
반사된 함수의 매개변수 목록이 생략 부호 매개변수를 포함하는지 여부를 확인합니다
(클래스 템플릿) |
|
(reflection TS)
|
리플렉트된 함수가 non-throwing인지 검사합니다
(클래스 템플릿) |
|
(reflection TS)
|
리플렉션된 함수가 삭제되었는지 확인합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 변수 또는 함수가 constexpr인지 검사합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
리플렉션된 네임스페이스나 함수가 인라인인지 확인합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 괄호식의 괄호 없는 표현식을 반영하는 메타 객체 타입을 획득함
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된
function-call-expression
에서
함수를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된
functional-type-conv-expression
에서
생성자를 반영하는 메타 객체 타입을 획득함
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 변수나 함수의 주소를 얻거나, 반사된 비정적 멤버에 대한 멤버 포인터 값을 얻음
(클래스 템플릿) |
|
|
|
리플렉션된 멤버 함수가 각각
const
,
volatile
,
&
, 또는
&&
한정자로 선언되었는지 확인합니다
(클래스 템플릿) |
|
|
(reflection TS)
|
리플렉션된 멤버 함수가 기본 클래스의 멤버 함수를 오버라이드하는지 확인합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 클래스 또는 멤버 함수가
final
으로 표시되었는지 확인합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 변수가 정적 저장 기간을 가지는지, 또는 반사된 멤버 함수가 정적인지 검사합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
리플렉션된 특수 멤버 함수가 암시적으로 선언되었는지 확인합니다
(클래스 템플릿) |
|
(reflection TS)
|
반영된 특별 멤버 함수가 첫 번째 선언에서 기본값으로 지정되었는지 확인합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 생성자 또는 변환 함수가
explicit
로 선언되었는지 확인합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 멤버 함수가 가상 함수인지 확인합니다
(클래스 템플릿) |
|
(reflection TS)
|
리플렉션된 멤버 함수가 순수 가상 함수인지 확인합니다
(클래스 템플릿) |
|
|
|
(reflection TS)
|
반사된 클로저 타입의 캡처들을 반영하는 메타-객체 시퀀스 타입을 획득함
(클래스 템플릿) |
|
(reflection TS)
|
반사된 클로저 타입의 람다 표현식의 캡처 기본값이 각각
=
또는
&
인지 확인합니다
(클래스 템플릿) |
|
(reflection TS)
|
반사된 클로저 타입의
operator()
가
const
로 선언되었는지 확인합니다
(클래스 템플릿) |
|
|
|
(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 연산자가 반환하는 클래스
(클래스) |
|
|
(C++11)
|
컴파일 타임 타입 정보 유틸리티 |