Frage

Die meisten reif C ++ Projekte scheinen ein eigenes Reflexion und Attribut-System zu haben , das heißt für Attribute definieren, die durch Zeichenfolge abgerufen werden können und automatisch serializable. Mindestens viele C ++ Projekte, die ich nahm an schien neu zu erfinden das Rad .

Kennen Sie gute Open-Source-Bibliotheken für C ++, die Reflexion und Attribut Container unterstützen, insbesondere:

  • Definieren von RTTI und Attribute über Makros
  • Zugriff auf RTTI und Attribute über Code
  • Automatische Serialisierung von Attributen
  • Hören Attributänderungen (z.B. OnValueChanged)
War es hilfreich?

Lösung

Sie können einen Blick auf die beiden Werkzeuge unten haben. Ich habe noch nie verwendet entweder von ihnen, so kann ich Ihnen nicht sagen, wie (im) praktisch sie sind.

XRTTI :

  

Xrtti ist ein Werkzeug und begleitende C ++ Bibliothek, die das Standard-Runtime-Typsystem von C ++ erweitert einen viel reicheren Satz von Reflexions Informationen über Klassen und Methoden bereitzustellen, um diese Klassen und ihre Mitglieder zu manipulieren.

OpenC ++ :

  

OpenC ++ C ++ Frontend-Bibliothek (Lexer + Parser + DOM / MOP) und Source-to-Source-Übersetzer. OpenC ++ ermöglicht die Entwicklung von C ++ Tools, Erweiterungen, domänenspezifische Compiler-Optimierungen und Runtime-Metaobjekt Protokolle.

Andere Tipps

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

C ++ erfüllt Reflection

Wie auch immer Sie sich entscheiden, wird es wahrscheinlich schrecklich Makros haben, schwer zu debuggen Code oder seltsame Build Schritte. Ich habe gesehen System automatisch den Serialisierungscode aus DevStudio der PDB-Datei erzeugen.

Im Ernst, für kleine Projekte, wird es leichter sein, zu schreiben, Speichern / Laden-Funktionen (oder Streaming-Operatoren). In der Tat, für große Projekte, die möglicherweise halten -. Es ist offensichtlich, was los ist, und Sie würden in der Regel Code ändern müssen sowieso, wenn die Strukturänderungen

Es gibt ein neues Projekt ist die Reflexion in C ++ bietet einen ganz anderen Ansatz: CAMP . https://github.com/tegesoft/camp

CAMP verwendet keinen Precompilers, die Klassen / Eigenschaften / Funktionen / ... werden manuell eine Syntax ähnlich wie Boost.Python oder luabind mit erklärt. Natürlich können die Menschen einen Precompiler wie gccxml verwenden oder Open-c ++, diese Erklärung zu erzeugen, wenn sie es vorziehen.

Es basiert auf reinen C ++ und Header steigert nur, und dank der Kraft der Vorlage Meta-Programmierung es jede Art von bindungsfähigen Einheit unterstützt (Vererbung und seltsamen Konstrukteure sind kein Problem, zum Beispiel).

Es ist unter der MIT-Lizenz verteilt (bisher LGPL).

sah ich diese Dinge für eine ganze Weile, aber sie neigen dazu, sehr plump zu sein. Sie könnten Sie verhindern, dass Vererbung oder mit seltsamen Bauer etc etc. Am Ende sie endete als zu viel von einer Belastung anstelle eines Komfort.

Dieser Ansatz für die Belichtung Mitglieder, die ich jetzt nutzen ist ganz leicht und lässt Sie eine Klasse für die Serialisierung erkunden oder alle Felder Einstellung namens „x“ auf 0, zum Beispiel. Es ist auch so sehr, sehr schnell statisch bestimmt. Keine Schichten von Bibliotheks-Code oder Code-gen zu befürchten mit dem Build-Prozess durcheinander. Es verallgemeinert zu Hierarchien von verschachtelten Typen.

Stellen Sie Ihren Editor mit einigen Makros bis zu automatisieren einige dieser Dinge zu schreiben.

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 << " ";
     }
}

auf diese Sehen auch für eine Weile. Die aktuelle einfachste Lösung scheint BOOST_FUSION_ADAPT_STRUCT zu sein. Praktisch, wenn Sie eine Bibliothek / Header müssen Sie nur Ihre Struktur Felder in die BOOST_FUSION_ADAPT_STRUCT () Makro hinzufügen, wie zeigt . Ja, es hat Einschränkungen viele andere Leute erwähnt haben. Und es Hörer nicht direkt unterstützt.

Die anderen vielversprechenden Lösungen, die ich sah in sind

Dies ist eine notorische Schwäche der C ++ Sprache im Allgemeinen, weil die Dinge, die standardisiert werden müßten Reflexion Implementierungen tragbar und lohnend sind nicht Standard. Aufrufkonventionen, Objektlayouts und Symbol in dem Sinne kommen Mangeln, aber es gibt auch andere.

Der Mangel an Richtung von der Norm bedeutet, dass Compiler Implementierer anders einige Dinge tun wird, was bedeutet, dass nur sehr wenige Menschen die Motivation haben, eine tragbare Reflexion Bibliothek zu schreiben, was bedeutet, dass Menschen, die Reflexion neu erfinden das Rad brauchen, aber nur gerade genug für das, was sie brauchen. Dies geschieht ad infinitum , und hier sind wir.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top