Dokumentation
Refly-CPP ist eine Nur-Header-Bibliothek, die C ++ Kompilierungszeitreflexions- und Selbstbeobachtungsfunktionen bietet. Durch die Codierung von Typ-Metadaten im Typ-System können Sie mit Refl-CPP Typen und ihre Felder und Funktionen über die Metaprogrammierung von Contexpr und Template verarbeiten.
Verwenden Sie Refly-CPP in Ihrem Projekt? Ich möchte davon hören: Kontaktieren Sie mich per E-Mail (siehe mein Profil), öffnen Sie ein Problem oder fügen Sie das #Refl-CPP-Tag zu Ihren Themen hinzu!
Haben Sie eine Frage? Versuchen Sie, im Gitter -Kanal zu fragen.
Willst du Refly-CPP unterstützen? Überlegen Sie eine Spende.
Der Refl-CPP zielt darauf ab, ein generisches Reflexionssystem bereitzustellen, das für Ihren Anforderungen flexibel genug ist und gleichzeitig eine relativ kleine API-Oberfläche aufrechterhält.
Einige nette Dinge, die Refly-CPP aus dem Feld unterstützt:
std::tuple S, die mit Typen und Mitgliedsdeskriptoren zugeordnet sindproxy<T> -Typen mit denselben Mitgliedern wie T , mit denen die Funktionalität umwickelt oder erweitert werden kannImplementieren Sie ein einfaches Serialisierungssystem - Beispiel -Serialisierung.CPP - Ansicht im Compiler Explorer implementiert ein effizientes generisches Serialisierungsverfahren
Einfache SQL -Datenbankabstraktion - Beispiel -dao.cpp - Ansicht im Compiler Explorer implementiert ein grundlegendes ORM
Iterate Basisklassen mit bases<> - Beispiel -Inheritance.cpp - Ansicht im Compiler Explorer verwendet das integrierte bases<> Attribut, um über die Basisklassen eines Typs zu iterieren
Zugriffsreflexionsinformationen zur Laufzeit -Beispiel-Custom-rtti.cpp-Ansicht im Compiler Explorer implementiert eine grundlegende Laufzeitabstraktion über Refly-CPP, die zur Laufzeit über benutzerdefinierte Metadatenobjekte Zugriff auf die Reflexionsmetadaten ermöglicht
XML-basierte GUI mit stark typen Eigenschaften -Beispiel-Binding.cpp-Ansicht im Compiler Explorer implementiert ein System zum Lesen von XML
T Sie eine generische Builder -Klasse -Fabrik builder<T> Beispielbauer
Konvertieren Sie Felder in Accessor -Methoden - Beispiel -proxy.cpp - Ansicht im Compiler Explorer verwendet die Proxy -Funktion, um ein generisches Typ value_proxy<T> zu erstellen, das alle Felder von T über Accessors -Methoden freilegt
Sehen Sie sich ein Array von Strukturen als Struktur von Arrays an-Beispiel-Struktur-of-arrays.cpp-View im Compiler Explorer verwendet die Proxy-Funktion, um einen generischen Typ struct_of_arrays<T> zu erstellen, der alle Mitglieder von T in std::vector speichert, aber auch einen T operator[](int) , der die einzelnen Objekte auf dem Damen einbauen, auf dem Demand-Objekte auf dem Domand und einem T-Demand konstruiert.
Generieren Sie eine Struktur von std::optional Mitglieder - Beispiel -partials.cpp - Ansicht im Compiler Explorer verwendet die Proxy -Funktion, um einen generischen Typ partial<T> zu erstellen, der alle Mitglieder von T in std::optional einbindet
Während meines letzten Jahres in der High-School fing ich an, Reflas zu entwickeln. Ich sollte für Prüfungen studieren, aber ich hatte gerade den ursprünglichen Vorschlag für statische Reflexion (2017) gelesen, und nachdem ich festgestellt hatte, dass es nicht so schnell kam, beschloss ich, dass ich versuchen musste, wie viele dieser Funktionen in einer Kompilierungsbibliothek so viele dieser Funktionen zu übertreffen.
Die Bibliothek ist seit den frühen Tagen stark gewachsen und verändert sich stark, aber selbst nach einigen Jahren habe ich noch keine andere Reflexionsbibliothek gesehen, die die Metaprogrammierung von Contexpr und Vorlagen unterstützt. Mit anderen Bibliotheken müssen Sie häufig zur Laufzeit eine Metadatenstruktur laufen, Funktionszeiger aufrufen und Typenasure verwenden. Mit Refl-CPP verarbeiten Sie die Typ-Metadaten bei Compile-Time über for_each Loops, alle Typen sind vorhanden, und der Compiler kann oft alles inline und denselben Code generieren, den Sie handgeschrieben hätten.
Alle Nutzfunktionen in Refly-CPP sind Contexpr (mit Ausnahme der in refl::runtime ). Compiler werden im Allgemeinen alle Schleifen und anderen Konstrukte (bei Verwendung -O2 ) inlinieren und Code generieren, der genauso schnell ausgeführt wird, als wäre er handgeschrieben.
Dank einiger spezieller Optimierungen der Kompilierung ist die Typ-Metadaten im Allgemeinen nicht instanziiert (es muss kein Code-Gen stattfinden), wenn die Typen selbst in der Reflexion nicht verwendet werden. Bei 0,12,2 gab es auch einige erhebliche Verringerungen der Kompilierungszeit bei der Verwendung von Eigenschaften Nr. 60.
Abgesehen davon ein Wort der Vorsicht: Ich habe beobachtet, dass nach etwa den 250 reflektierten Mitgliedern die Zusammenstellung von Zeiten schnell wächst. Wenn Ihre Codebasis viele riesige Klassen (+250 Funktionen) enthält und Sie alle mit refl-cpp reflektieren müssen , könnte dies ein Deal Breaker sein - Benchmark, bevor sie verwendet werden.
Um Refly-CPP als Single-Header-Bibliothek zu verwenden, include/refl.hpp zu Ihrem Include-Verzeichnis Kopieren.
Sie können auch Refl-CPP als CMake-Abhängigkeit verbrauchen (3.14+ Erforderlich, danke @friendlyanon).
vcpkg install refl-cpp (danke @vennor)conan install refl-cpp Die Online -Dokumentation ist mit Doxygen erstellt. Führen Sie doxygen Doxyfile in docs/ um es zu aktualisieren.
Führen Sie CMAKE mit -Drefl-cpp_DEVELOPER_MODE=ON und machen Sie das Ziel des refl-cpp-tests .
Führen Sie CMake mit -Drefl-cpp_DEVELOPER_MODE=ON Flag aus. Möglicherweise möchten Sie auch ein benutzerdefiniertes Voreinstellung für ein bequemeres Entwicklererlebnis einrichten (siehe diesen Kommentar zu #44).