Donnerstag, Dezember 12, 2019

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)
InformationsquelleAutor Fabian | 2008-09-17

8 Kommentare

  1. 5

    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:

    Xrtti ist ein Werkzeug und begleitende C++ – Bibliothek erweitert die standard-runtime-Typ-system von C++, um eine viel umfangreichere Reflexion-Informationen über Klassen und Methoden zur Manipulation dieser Klassen und Ihrer Mitglieder.

    OpenC++:

    OpenC++ ist C++ frontend-Bibliothek (lexer+parser+DOM/MOP) und den source-to-source-übersetzer. OpenC++ ermöglicht die Entwicklung von C++ – Sprache, tools, extensions, domain-spezifischen compiler-Optimierungen und Laufzeit-metaobject Protokolle.

    • XRTTI hat noch eine aktualisierte version für die späten Linux-Distributionen. OpenC++ scheint zu alt zu sein.
  2. 12

    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).

  3. 11

    Dies ist, was Sie erhalten, wenn C++ erfüllt Reflexion:

    Attribut & Reflexion Bibliotheken für C++?

    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.

    • Es sei denn, meine app bereits verwendet Qt, ich erstellen Sie streaming-Operatoren für jede meiner Klassen, die gespeichert werden müssen.
    • +1 : für das Foto 😉 Scherz. Ich Stimme mit der Schlussfolgerung. Verwenden Sie Handwerk serialisers oder verwenden Sie eine andere Sprache 🙂
    • +1 : für das Foto, Nein, wirklich, es sagt eine Menge aus 😀
    • Der Wagen Schriftzug ist ein Tippfehler, sollte l337!
  4. 4

    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.

    struct point
    {
         int x;
         int y;
    
         //add this to your classes
         template <typename Visitor>
         void visit(Visitor v)
         {
             v->visit(x, "x"); 
             v->visit(y, "y");
         }
    };
    
    
    /** Outputs any type to standard output in key=value format */
    struct stdout_visitor
    {
         template <typename T>
         void visit(const T& rhs)
         {
             rhs.visit(this);
         }
    
         template <typename Scalar>
         void visit (const Scalar& s, const char* name)
         {
              std::cout << name << " = " << s << " ";
         }
    }
    • Während ich es mag, es sollte angemerkt werden, dass es nicht eine Allgemeine Lösung – z.B. bricht es, sobald die tatsächliche statische Typ ist nicht bekannt.
    • Das ist ein guter Ansatz. Ich machte einmal einen Präprozessor generiert 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/nJVxl3SzpFUJ
    • Danke das ist eine so einfache und gute Idee.
  5. 3

    Dies 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.

  6. 3

    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

    • CAMP und XRTTI/gccxml, aber beide scheinen eine Hürde zu bringen externe tools Abhängigkeiten in Ihrem Projekt.
    • Jahren habe ich perl c2ph/pstruct dump meta-info aus der Ausgabe von gcc -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.

    • Funktioniert diese aktivieren /Reflexion/? Ich kann sehen, wie das passt, eine Struktur, die ein Modell der Sequenz Konzept von Boost MPL/Fusion, so dass Sie können Durchlaufen Sie die Felder. Jedoch, erhalten Sie die Namen der Felder oder die Verwendung der Namen für den Zugriff auf Felder ist aus der Frage, IIRC. Das ist auch nicht das sprechen über den struct-Typ selbst
    • Wie sehen Sie die Feldtypen sind gedruckt von __cxa_demangle(typeid(t).name()). Die gleiche Funktion kann angewendet werden, um struct-decoder und array-decoder drucken alle struct-Typen und array-Typen, einschließlich der obersten Ebene. Wenn Sie denken, java vm hält eine Liste aller Klassen/Objekte in einem internen binären Liste, die meta-Daten dieses Beispiel Deponien ist in etwa auf diesem Niveau. Aus, dass low-level-Informationen (sowie die runtime-Adresse Informationen), müssen Sie code schreiben, um Zugriff auf Felder (die Namen im string oder char [] – format). Das wäre die andere Hälfte der ganzen Reflexion Bild.
    • Ah. So, der wichtigste Teil der Antwort ist nicht wirklich da. Hmmm, das war überraschend. Anyways, ich werde +1 für 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)
    • Eigentlich der wichtigste Teil für mich am wenigsten Laufzeit Kosten und am wenigsten aufdringlich Prozess. c2ph/pstruct ist nicht sehr portabel, wie es zu sein scheint. Ich hatte zu verbringen eine großen Aufwand zu beheben pstruct für die spezifischen gcc ersticht dump. Nach Entleerung des Typs info und abrufen der Adresse info aus dem Baujahr binary, nur einen Speicherzugriff Schnittstelle wird benötigt, um gebaut werden, in die Laufzeit. Alles, was sonst getan werden kann, aus der box (ich Mach embedded-Programmierung, und verwenden Sie reflektion, für die vor allem das testen). Damit diese ADAPT_STRUCT ist die einfachste Lösung, so weit ich finden kann.
    • Gerade wieder rot sehe den letzten Kommentar: Man muss zwei Runden. Die erste Runde kompilieren/starten auf einer host-Maschine zu verwenden, __cxa*/boost-dump-meta-info. Die 2. Runde zu bauen, die Metainformationen in dem format, das Sie definieren, in das Ziel. Dann in die Ziel-build-es ist keine Abhängigkeit von der boost-oder g++.
  7. 2

    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.

  8. 0

    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

    • Link sagt „Sie benötigen Berechtigungen“, offenbar diese Website wurde eingestellt, um einen privaten Zugang.

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...