Dokumentasi
Refl-CPP adalah perpustakaan header saja yang menyediakan refleksi waktu kompilasi dan kemampuan introspeksi ke C ++. Dengan pengkodean jenis metadata dalam sistem tipe, REFL-CPP memungkinkan Anda untuk memproses jenis dan bidang dan fungsinya melalui metaprogramming ConstexPR dan Templat.
Menggunakan Refl-CPP di proyek Anda? Saya ingin mendengarnya: hubungi saya melalui email (lihat profil saya), buka masalah atau tambahkan tag #refl-cpp ke topik Anda!
Punya pertanyaan? Coba tanyakan di saluran gitter.
Ingin mendukung Refl-CPP? Pertimbangkan untuk memberikan donasi.
Refl-CPP bertujuan untuk menyediakan sistem refleksi generik yang cukup fleksibel agar sesuai dengan kebutuhan Anda sambil mempertahankan permukaan API yang relatif kecil.
Beberapa hal bagus yang didukung oleh Refl-CPP: out-of-the-box:
std::tuple S terkait dengan jenis dan deskriptor anggotaproxy<T> Generik dengan Anggota yang sama dengan T yang dapat digunakan untuk membungkus atau memperluas fungsionalitasMenerapkan Sistem Serialisasi Sederhana - Contoh -Serialisasi.CPP - Lihat di Compiler Explorer mengimplementasikan prosedur serialisasi generik yang efisien dari awal
Abstraksi Database SQL Sederhana - Contoh -dao.cpp - Lihat di Compiler Explorer mengimplementasikan sistem ORM dasar yang dapat menghasilkan pernyataan SQL pada waktu kompilasi dari kelas model menggunakan properti khusus
Iterasi kelas dasar dengan bases<> - example -heritance.cpp - tampilan di compiler explorer menggunakan bases<> atribut untuk mengulangi di kelas dasar tipe
Akses Informasi Refleksi Saat Runtime -Contoh-Custom-RTTI.CPP-Lihat di Compiler Explorer mengimplementasikan abstraksi runtime dasar atas Refl-CPP yang menyediakan akses ke metadata refleksi saat runtime melalui objek metadata khusus
GUI Berbasis XML dengan tipe-tipe properti -contoh-binding.cpp-tampilan di Compiler Explorer mengimplementasikan sistem untuk membaca sumber daya XML dengan refl-CPP, dengan membangun lapisan refleksi runtime khusus di atas Refl-CPP
Menerapkan pabrik kelas pembangun generik - contoh -builders.cpp - Lihat di Compiler Explorer mendefinisikan kelas generik builder<T> , yang mengimplementasikan pola pembangun untuk jenis T apa pun.
Konversi bidang ke Metode Accessor - Contoh -Proxy.cpp - Lihat di Compiler Explorer menggunakan fitur proxy untuk membuat tipe generik value_proxy<T> yang memperlihatkan semua bidang T melalui metode aksesor
Lihat Array Struct sebagai Struct Array -Contoh-Struktur-Farrays.cpp-Lihat di Compiler Explorer menggunakan fitur proxy untuk membuat tipe generik struct_of_arrays<T> yang menyimpan semua anggota T di std::vector , tetapi juga memiliki T operator[](int) yang membangun objek individu di-demand
Menghasilkan struct std::optional - contoh -partals.cpp - Lihat di Compiler Explorer menggunakan fitur proxy untuk membuat tipe generik partial<T> yang membungkus semua anggota T di std::optional
Saya mulai mengembangkan Refl-CPP selama tahun terakhir saya di sekolah menengah. Saya seharusnya belajar untuk ujian, tetapi saya baru saja membaca proposal Static Reflection (2017) asli, dan setelah menyadari bahwa itu tidak akan datang dalam waktu dekat, saya memutuskan bahwa saya harus mencoba menjejalkan sebanyak mungkin fitur-fitur tersebut ke perpustakaan waktu kompilasi.
Perpustakaan telah tumbuh dan banyak berubah sejak hari -hari awal, tetapi bahkan setelah beberapa tahun, saya masih belum melihat perpustakaan refleksi lain yang mendukung metaprogramming Constexpr dan Template. Dengan perpustakaan lain, Anda sering harus berjalan dengan struktur metadata saat runtime, memohon pointer fungsi, dan menggunakan tipe-erasure. Dengan Refl-CPP, Anda memproses metadata tipe pada waktu kompilasi, melalui for_each loop, semua jenis ada di sana, dan kompiler sering dapat menyambungkan semuanya dan menghasilkan kode yang sama dengan yang akan Anda tulis dengan tangan.
Semua fungsi utilitas dalam refl-cpp adalah Constexpr (kecuali yang ada di refl::runtime ). Kompiler umumnya akan melapisi semua loop dan konstruksi lainnya (saat menggunakan -O2 ) dan menghasilkan kode yang berjalan secepat itu ditulis tangan.
Berkat beberapa optimisasi waktu kompilasi khusus, jenis metadata umumnya tidak dipakai (tidak ada kode-gen yang perlu terjadi) ketika tipe itu sendiri tidak digunakan dalam refleksi. Dengan 0,12.2, ada juga beberapa pengurangan besar dalam waktu kompilasi saat menggunakan Properties #60.
Yang sedang berkata, kata peringatan: Saya telah mengamati bahwa setelah sekitar 250 tanda anggota yang dipantulkan, waktu kompilasi mulai tumbuh dengan cepat. Jika basis kode Anda berisi banyak kelas besar (+250 fungsi), dan Anda harus memiliki semuanya tercermin dengan refl-cpp , ini mungkin pemecah kesepakatan - benchmark sebelum digunakan.
Untuk menggunakan Refl-CPP sebagai pustaka header tunggal, salin include/refl.hpp ke direktori Anda.
Anda juga dapat mengkonsumsi refl-CPP sebagai CMake Digergecy (3,14+ diperlukan, terima kasih @friendlylyanon).
vcpkg install refl-cpp (terima kasih @vennor)conan install refl-cpp Dokumentasi online dibangun dengan Doxygen. Jalankan doxygen Doxyfile di docs/ untuk memperbaruinya.
Jalankan cmake dengan -Drefl-cpp_DEVELOPER_MODE=ON dan buat target refl-cpp-tests .
Jalankan cmake dengan -Drefl-cpp_DEVELOPER_MODE=ON flag. Anda mungkin juga ingin mengatur preset khusus untuk pengalaman pengembang yang lebih nyaman (lihat komentar ini di #44).