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 μ—°μ‚°μžκ°€ λ°˜ν™˜ν•˜λŠ” 클래슀
(클래슀)
컴파일 νƒ€μž„ νƒ€μž… 정보 μœ ν‹Έλ¦¬ν‹°