เอกสาร
Refl-CPP เป็นไลบรารีส่วนหัวอย่างเดียวซึ่งให้การสะท้อนเวลารวบรวมเวลาและความสามารถในการวิปัสสนากับ C ++ ด้วยการเข้ารหัสเมตาดาต้าประเภทในระบบประเภท refl-cpp ช่วยให้คุณสามารถประมวลผลประเภทและฟิลด์และฟังก์ชั่นของพวกเขาผ่าน constexpr และเทมเพลต metaprogramming
ใช้ refl-cpp ในโครงการของคุณ? ฉันต้องการทราบเกี่ยวกับเรื่องนี้: ติดต่อฉันทางอีเมล (ดูโปรไฟล์ของฉัน) เปิดปัญหาหรือเพิ่มแท็ก #refl-cpp ในหัวข้อของคุณ!
มีคำถาม? ลองถามในช่อง Gitter
ต้องการสนับสนุน refl-cpp หรือไม่? พิจารณาบริจาค
Refl-CPP มีจุดมุ่งหมายเพื่อให้ระบบสะท้อนแสงทั่วไปที่ยืดหยุ่นพอที่จะเหมาะกับความต้องการของคุณในขณะที่ยังคงรักษาพื้นผิว API ที่ค่อนข้างเล็ก
บางสิ่งที่ดี refl-cpp รองรับนอกกรอบ:
std::tuple s ที่เกี่ยวข้องกับประเภทและ descriptors สมาชิกproxy<T> ประเภทที่มีสมาชิกเดียวกันกับ T ที่สามารถใช้ในการห่อหรือขยายฟังก์ชันการทำงานใช้ระบบการทำให้เป็นอนุกรมอย่างง่าย - example -serialization.cpp - ดูในคอมไพเลอร์ Explorer ใช้ขั้นตอนการทำให้เป็นอนุกรมทั่วไปที่มีประสิทธิภาพตั้งแต่เริ่มต้น
Simple SQL Database Abstraction - example -dao.cpp - ดูในคอมไพเลอร์ Explorer ใช้ระบบ ORM พื้นฐานซึ่งสามารถสร้างคำสั่ง SQL ได้ที่คอมไพล์ - ไทม์จากคลาสโมเดลโดยใช้คุณสมบัติที่กำหนดเอง
การทำซ้ำคลาสฐานที่มี bases<> - example -inheritance.cpp - ดูใน Compiler Explorer ใช้แอตทริบิวต์ใน bases<> แอตทริบิวต์เพื่อวนซ้ำผ่านคลาสฐานของประเภท
การเข้าถึงข้อมูลการสะท้อนแสงที่รันไทม์ -ตัวอย่าง-custom-rtti.cpp-ดูในคอมไพเลอร์ Explorer ใช้งานบทสรุปพื้นฐานของรันไทม์เหนือ refl-cpp ซึ่งให้การเข้าถึงข้อมูลเมตาสะท้อนแสงที่รันไทม์ผ่านวัตถุข้อมูลเมตาแบบกำหนดเอง
GUI ที่ใช้ XML พร้อมคุณสมบัติประเภทอย่างยิ่ง -ตัวอย่างที่มีข้อผูกมัด.
ใช้โรงงานคลาส Builder ทั่วไป - ตัวอย่าง builders.cpp - ดูในคอมไพเลอร์ Explorer กำหนดคลาส builder<T> ซึ่งใช้รูปแบบตัวสร้างสำหรับประเภทใด T
แปลงฟิลด์เป็นวิธีการ accessor - example -proxy.cpp - ดูในคอมไพเลอร์ Explorer ใช้คุณสมบัติพร็อกซีเพื่อสร้างค่า T ทั่วไป value_proxy<T>
ดูอาร์เรย์ของ structs เป็น struct of array- ตัวอย่าง-struct-of-arrays.cpp-ดูในคอมไพเลอร์ Explorer ใช้คุณสมบัติพร็อกซีเพื่อสร้าง struct_of_arrays<T> ซึ่งจัดเก็บสมาชิกทั้งหมดของ T ใน std::vector แต่ยังมีตัวดำเนินการ T operator[](int)
สร้าง struct ของ std::optional - example -partials.cpp - ดูในคอมไพเลอร์ Explorer ใช้คุณสมบัติพร็อกซีเพื่อสร้างประเภททั่วไป partial<T> ซึ่งห่อสมาชิกทั้งหมดของ T ใน std::optional
ฉันเริ่มพัฒนา refl-cpp ในช่วงปีสุดท้ายของฉันในโรงเรียนมัธยม ฉันควรจะศึกษาเพื่อสอบ แต่ฉันเพิ่งอ่านข้อเสนอการสะท้อนแบบคงที่ดั้งเดิม (2017) และหลังจากตระหนักว่ามันไม่ได้มาทุกเวลาเร็ว ๆ นี้ฉันตัดสินใจว่าฉันต้องพยายามยัดเยียดคุณสมบัติเหล่านั้นให้เป็นไปได้ในห้องสมุดคอมไพล์เวลา
ห้องสมุดเติบโตขึ้นและเปลี่ยนแปลงไปมากตั้งแต่วันแรก ๆ แต่หลังจากผ่านไปหลายปีฉันก็ยังไม่เคยเห็นห้องสมุดสะท้อนแสงอีกอันที่รองรับ constexpr และ metaprogramming เทมเพลต ด้วยห้องสมุดอื่น ๆ คุณมักจะต้องเดินโครงสร้างข้อมูลเมตาที่รันไทม์เรียกใช้พอยน์เตอร์ฟังก์ชั่นและใช้การพิมพ์ประเภท ด้วย refl-CPP คุณจะประมวลผลข้อมูลเมตาประเภทที่คอมไพล์-เวลาผ่าน for_each ลูปทุกประเภทอยู่ที่นั่นและคอมไพเลอร์มักจะอินไลน์ทุกอย่างและสร้างรหัสเดียวกับที่คุณจะเขียนด้วยมือ
ฟังก์ชั่นยูทิลิตี้ทั้งหมดใน refl-CPP เป็น constexpr (ยกเว้นใน refl::runtime ) คอมไพเลอร์โดยทั่วไปจะอินไลน์ลูปทั้งหมดและโครงสร้างอื่น ๆ (เมื่อใช้ -O2 ) และสร้างรหัสที่ทำงานเร็วพอ ๆ กับว่ามันถูกเขียนด้วยมือ
ต้องขอบคุณการเพิ่มประสิทธิภาพเวลาคอมไพล์พิเศษบางอย่างทำให้ประเภทข้อมูลเมตานั้นไม่ได้มีการสร้างอินสแตนซ์ (ไม่จำเป็นต้องมีรหัส Gen ที่จะเกิดขึ้น) เมื่อประเภทตัวเองไม่ได้ใช้ในการสะท้อนกลับ ด้วย 0.12.2 นอกจากนี้ยังมีการลดลงอย่างมากในเวลารวบรวมเมื่อใช้คุณสมบัติ #60
ที่ถูกกล่าวว่าคำเตือน: ฉันสังเกตเห็นว่าหลังจากประมาณ 250 สะท้อนให้เห็นถึงเครื่องหมายของสมาชิกเวลาการรวบรวมเริ่มเติบโตอย่างรวดเร็ว หาก codebase ของคุณมีคลาสขนาดใหญ่จำนวนมาก (+250 ฟังก์ชั่น) และคุณ ต้อง มีทั้งหมดที่สะท้อนด้วย refl-cpp นี่อาจเป็นข้อตกลงเบรกเกอร์ - เกณฑ์มาตรฐานก่อนที่จะใช้
หากต้องการใช้ refl-cpp เป็นไลบรารีหัวเดี่ยวคัดลอก include/refl.hpp ไปยังไดเรกทอรีรวมของคุณ
นอกจากนี้คุณยังสามารถใช้ refl-cpp เป็น cmake idercy (จำเป็นต้องใช้ 3.14+ ขอบคุณ @friendlyanon)
vcpkg install refl-cpp (ขอบคุณ @vennor)conan install refl-cpp เอกสารออนไลน์ถูกสร้างขึ้นด้วย Doxygen เรียกใช้ doxygen Doxyfile ใน docs/ เพื่ออัปเดต
เรียกใช้ cmake ด้วย -Drefl-cpp_DEVELOPER_MODE=ON และทำให้เป้าหมาย refl-cpp-tests
เรียกใช้ cmake ด้วย -Drefl-cpp_DEVELOPER_MODE=ON ธง คุณอาจต้องการตั้งค่าที่ตั้งไว้ล่วงหน้าสำหรับประสบการณ์นักพัฒนาที่สะดวกยิ่งขึ้น (ดูความคิดเห็นนี้ใน #44)