Reflection TS: การสะท้อนคงที่ของ enums (และประเภทอื่น ๆ )
Reflection TSโดยเฉพาะ [reflect.ops.enum] / 2 ของร่าง Reflection TS เวอร์ชันล่าสุดนำเสนอการget_enumerators
TransformationTrait
ดำเนินการ:
[reflect.ops.enum] / 2
template <Enum T> struct get_enumerators
ความเชี่ยวชาญทั้งหมดget_enumerators<T>
ต้องเป็นไปตาม
TransformationTrait
ข้อกำหนด (20.10.1) ชนิดที่ซ้อนกันชื่อ
type
กำหนดประเภทวัตถุ meta ความพึงพอใจ
ObjectSequence
ที่มีองค์ประกอบที่พอใจEnumerator
และสะท้อน enumerators T
ประเภทนับสะท้อน
[reflect.ops.objseq] ของแบบร่างครอบคลุมObjectSequence
การดำเนินการโดยเฉพาะ [reflect.ops.objseq] / 1 จะครอบคลุมget_size
ลักษณะการแยกจำนวนองค์ประกอบสำหรับ meta-object ที่ตรงตามความต้องการObjectSequence
:
[reflect.ops.objseq] / 1
template <ObjectSequence T> struct get_size;
เฉพาะทั้งหมดget_size<T>
จะตอบสนองความ
UnaryTypeTrait
ต้องการ (20.10.1) มีลักษณะฐานของ
integral_constant<size_t, N>
ที่N
เป็นจำนวนขององค์ประกอบในลำดับวัตถุ
ดังนั้นใน Reflection TS ต้องได้รับการยอมรับและนำไปใช้ในรูปแบบปัจจุบันจำนวนองค์ประกอบของ enum สามารถคำนวณได้ในเวลารวบรวมดังนี้:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators<Example>::type;
static_assert(get_size<ExampleEnumerators>::value == 5U, "");
ที่ซึ่งเราน่าจะเห็นเทมเพลตนามแฝงget_enumerators_v
และget_type_v
ทำให้การสะท้อนง่ายขึ้น:
enum class Example { A, B, C, D, E };
using ExampleEnumerators = get_enumerators_t<Example>;
static_assert(get_size_v<ExampleEnumerators> == 5U, "");
สถานะบน Reflection TS
ตามที่ระบุไว้ในรายงานการเดินทางของ Herb Sutter : การประชุมมาตรฐาน ISO C ++ ในช่วงฤดูร้อน(Rapperswil)จากการประชุมฤดูร้อนของคณะกรรมการ ISO C ++ ในวันที่ 9 มิถุนายน 2018 Reflection TS ได้รับการประกาศว่าเป็นคุณลักษณะที่สมบูรณ์
Reflection TS เป็นคุณลักษณะที่สมบูรณ์ : Reflection TS ได้รับการประกาศว่าเป็นคุณลักษณะที่สมบูรณ์และจะถูกส่งออกไปเพื่อลงคะแนนความคิดเห็นหลักในช่วงฤดูร้อน โปรดสังเกตอีกครั้งว่าไวยากรณ์ที่ใช้ metaprogramming ของเทมเพลตปัจจุบันของ TS เป็นเพียงตัวยึดเท่านั้น คำติชมที่ร้องขอนั้นอยู่ใน“ ความกล้า” หลักของการออกแบบและคณะกรรมการทราบดีอยู่แล้วว่ามีความตั้งใจที่จะแทนที่ไวยากรณ์พื้นผิวด้วยรูปแบบการเขียนโปรแกรมที่ง่ายกว่าซึ่งใช้รหัสเวลาคอมไพล์ธรรมดาและการเขียนโปรแกรมแบบไม่ใช้<>
สไตล์
และได้รับการวางแผนไว้สำหรับ C ++ 20 ในตอนแรกแต่ค่อนข้างไม่ชัดเจนว่า Reflection TS จะยังมีโอกาสที่จะทำให้เป็นรุ่น C ++ 20 หรือไม่