Reflection TS: phản xạ tĩnh của enum (và các loại khác)
Reflection TS , đặc biệt là [Reflection.ops.enum] / 2 của phiên bản mới nhất của bản thảo Reflection TS cung cấp get_enumerators
TransformationTrait
thao tác:
[phản ánh.ops.enum] / 2
template <Enum T> struct get_enumerators
Tất cả các chuyên môn của get_enumerators<T>
phải đáp ứng các
TransformationTrait
yêu cầu (20.10.1). Kiểu lồng nhau có tên
type
chỉ định kiểu siêu đối tượng thỏa mãn ObjectSequence
, chứa các phần tử đáp ứng Enumerator
và phản ánh các đối tượng của kiểu
liệt kê được phản ánh bởi T
.
[phản ánh.ops.objseq] của bản nháp bao gồm các ObjectSequence
hoạt động, trong đó đặc biệt là [phản ánh.ops.objseq] / 1 bao gồm get_size
đặc điểm trích xuất số lượng phần tử cho một siêu đối tượng đáp ứng ObjectSequence
:
[phản ánh.ops.objseq] / 1
template <ObjectSequence T> struct get_size;
Tất cả các chuyên ngành của get_size<T>
phải đáp ứng các
UnaryTypeTrait
yêu cầu (20.10.1) với một đặc tính cơ bản của
integral_constant<size_t, N>
, nơi N
là số phần tử trong dãy đối tượng.
Do đó, trong Reflection TS đã được chấp nhận và thực hiện ở dạng hiện tại của nó, số phần tử của một enum có thể được tính toán, tại thời điểm biên dịch, như sau:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators<Example>::type;
static_assert(get_size<ExampleEnumerators>::value == 5U, "");
nơi chúng ta có thể thấy các mẫu bí danh get_enumerators_v
và get_type_v
để đơn giản hóa phản ánh hơn nữa:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators_t<Example>;
static_assert(get_size_v<ExampleEnumerators> == 5U, "");
Trạng thái phản ánh TS
Như đã nêu trong báo cáo Chuyến đi của Herb Sutter : Cuộc họp tiêu chuẩn ISO C ++ mùa hè (Rapperswil) từ cuộc họp mùa hè của ủy ban ISO C ++ ngày 9 tháng 6 năm 2018, Reflection TS đã được tuyên bố là hoàn chỉnh về tính năng
Reflection TS đã hoàn chỉnh về tính năng : Reflection TS đã được tuyên bố là đã hoàn thành về tính năng và đang được gửi đi để bỏ phiếu bình luận chính trong mùa hè. Lưu ý một lần nữa rằng cú pháp dựa trên lập trình siêu chương trình mẫu hiện tại của TS chỉ là một trình giữ chỗ; phản hồi được yêu cầu nằm ở “ruột” cốt lõi của thiết kế và ủy ban đã biết họ có ý định thay thế cú pháp bề mặt bằng một mô hình lập trình đơn giản hơn sử dụng mã thời gian biên dịch thông thường và <>
lập trình siêu mẫu không theo kiểu.
và ban đầu được lên kế hoạch cho C ++ 20 , nhưng không rõ liệu Reflection TS có còn cơ hội đưa nó vào bản phát hành C ++ 20 hay không.