Attribut & Reflexion Bibliotheken für C++?
Meisten ausgereiften C++ - Projekte scheinen eine eigene Reflexion und Attribut-system, ich.e für die Definition der Attribute auf die zugegriffen werden kann durch die string-und die sind automatisch serialisierbar sind. Zumindest sind viele C++ - Projekte, an denen ich teilgenommen habe, schien das Rad neu erfinden.
Kennen Sie eine gute open-source-Bibliotheken für C++ die Unterstützung von Reflexions-und Attribut-Container, speziell:
- Definieren RTTI und Attribute über Makros
- Zugriff auf die RTTI und Attribute via code
- Automatisches serialisieren Attribute
- Hören, Attribut-änderungen (z.B. OnValueChanged)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben, könnten Sie einen Blick auf die beiden tools unter. Ich habe noch nie verwendet, entweder von Ihnen, so kann ich Ihnen nicht sagen, wie (un)praktisch Sie sind.
XRTTI:
OpenC++:
Gibt es ein neues Projekt, indem Sie die Reflexion in C++ mit einem völlig anderen Ansatz: CAMP.
https://github.com/tegesoft/camp
CAMP nicht mit einem precompiler, die Klassen/Eigenschaften/Funktionen/... deklariert werden manuell mit einer syntax ähnlich wie boost.python oder luabind. Natürlich, die Menschen können einen precompiler wie gccxml oder open-c++ zu generieren, diese Erklärung abgeben, wenn Sie bevorzugen.
Basiert das auf reinem C++ und boost-Header, und nur Dank der Kraft von template meta-Programmierung es unterstützt jede Art von bindbaren Person (Erbe und seltsame Konstruktoren sind nicht ein problem, zum Beispiel).
Es ist veröffentlicht unter der MIT-Lizenz (bisher LGPL).
Dies ist, was Sie erhalten, wenn C++ erfüllt Reflexion:
Was auch immer Sie wählen, Sie werden wahrscheinlich haben eine schreckliche Makros, schwer zu Debuggen, code oder seltsame build-Schritte. Ich habe gesehen, ein system generiert automatisch den code serialisieren von DevStudio die PDB-Datei.
Aber im ernst, für kleine Projekte, es wird einfacher sein, zu schreiben, save/load-Funktionen (oder die streaming-Operatoren). In der Tat, das könnte halten für große Projekte mit ein - es ist offensichtlich, was Los ist, und Sie würden in der Regel brauchen, um code ändern, jedenfalls, wenn die änderungen in der Struktur.
Sah ich diese Dinge für eine Weile, aber Sie neigen dazu, sehr heavy-handed. Sie könnte verhindern, dass Sie mit Vererbung oder mit seltsamen Konstruktoren usw usw. Am Ende werden Sie endete als zu viel von einer Belastung, statt der Bequemlichkeit.
Dieser Ansatz für die Aufdeckung von Mitgliedern, die ich jetzt benutze ist ganz leicht und lässt Sie erkunden Sie eine Klasse für die Serialisierung oder die Einstellung aller Felder genannt "x", 0, zum Beispiel. Es ist auch statisch bestimmt, so ist sehr sehr schnell. Keine Schichten von Bibliotheks-code oder code-gen zu kümmern, messing mit den build-Prozess. Sie vergröbert, um Hierarchien von geschachtelten Typen.
Stellen Sie Ihren editor mit Makros zu automatisieren schreiben einige von diesen Dingen.
visit()
Funktion-Vorlagen für Sie. Und dann noch ein paar funktoren zu serialisieren und Deserialisieren, JSON, Binär, text, etc... Keine hässliche Makros. groups.google.com/d/msg/comp.lang.c++/Ila1Tn09mm4/nJVxl3SzpFUJDies ist eine notorische Schwäche der Sprache C++ im Allgemeinen, weil die Dinge, die müssen standardisiert werden, um die Reflexion Implementierungen portabel und lohnt nicht standard. Aufrufkonventionen, Objekt-layouts und symbol mangeln in den Sinn kommen, aber es gibt andere als gut.
Den Mangel an Richtung von der Norm bedeutet, dass compiler-Entwickler wird einiges anders machen, was bedeutet, dass nur sehr wenige Menschen die motivation zum schreiben eines tragbaren Reflexion-Bibliothek, was bedeutet, dass Menschen, die Reflexion, das Rad neu zu erfinden, sondern nur einfach genug für das, was Sie brauchen. Dies geschieht ad infinitum, und hier sind wir.
Schaute sich das eine Weile auch. Der aktuelle einfachste Lösung zu sein scheint BOOST_FUSION_ADAPT_STRUCT. Praktisch sobald Sie einen library/header-Sie müssen nur noch Ihre struct-Feldern in die BOOST_FUSION_ADAPT_STRUCT () - makro, wie das Letzte segment des Codes zeigt. Ja, es hat Einschränkungen, die viele andere Leute erwähnt haben. Und es keine Unterstützung für den Zuhörer direkt.
Andere vielversprechende Lösungen, die ich in gesucht werden
c2ph
/pstruct
dump meta-info aus der Ausgabe vongcc -gstabs
, das ist weniger aufdringlich, aber braucht mehr Arbeit, obwohl es funktioniert perfekt für mich.Bezüglich der Anhebung/__cxa Ansatz, sobald Sie herausfinden, all die kleinen details, hinzufügen/ändern von Strukturen oder Felder ist einfach zu pflegen. derzeit nutzen wir es zum erstellen einer benutzerdefinierten Typen binding-Schicht auf der Oberseite des dbus, serialisieren, die die API-und ausblenden der transport - /RPC-details für einen verwalteten Objekt-Dienst-subsystem.
c2ph/pstruct
. Oldschool, aber funktioniert in den meisten Orten, wirklich. __cxa* ist nicht gerade portabel. Und ADAPT_STRUCT ist beides nicht sehr relevant, einfach, mit zu arbeiten, und nicht leicht automatisiert werden. Wenn Sie Makros verwenden, können Sie auch Makros verwenden, die vollständig (und nicht davon abhängen, ob Boost oder GCC ABI)Nicht einem Allgemeinen, sondern QT unterstützt durch eine meta-compiler, und ist GPL.
Mein Verständnis vom Gespräch mit dem QT-Menschen war, dass dies nicht möglich ist mit reinen C++, daher die Notwendigkeit für das moc.
Automatische Introspektion/Reflexion toolkit. Verwenden Sie meta-compiler wie Qt ' s und das hinzufügen von meta-Informationen direkt in den Objekt-Dateien. Intuitive, einfach zu verwenden. Keine externen Abhängigkeiten. Erlauben sogar automatisch spiegeln std::string und verwenden Sie dann in scripts. Bitte besuchen Sie IDK