Domanda

Più maturo C++ progetti sembrano avere una propria la riflessione e l'attributo di sistema, io.e per la definizione degli attributi che possono essere accessibili da stringa e sono automaticamente serializable.Almeno molti progetti in C++ ho partecipato sembrava reinventare la ruota.

Conosci buona librerie open source per il C++, a supporto di riflessione e di attributo contenitori, in particolare:

  • La definizione di RTTI e attributi tramite macro
  • L'accesso RTTI e attributi tramite codice
  • Automatica messa in serie di attributi
  • Ascolto attributo modifiche (ad es.OnValueChanged)
È stato utile?

Soluzione

Si potrebbe avere uno sguardo ai due strumenti.Io non l'ho mai usato, quindi non posso dirti come (im)pratico sono.

XRTTI:

Xrtti è uno strumento di accompagnamento della libreria C++ che si estende standard di runtime di sistema di tipo C++ che forniscono una gamma più ricca di riflessione, informazioni sulle classi e i metodi per manipolare queste classi e dei loro membri.

OpenC++:

OpenC++ è il C++ frontend biblioteca (lexer+parser+DOM/MOP) e sorgente a sorgente traduttore.OpenC++ consente di sviluppo del linguaggio C++ strumenti, estensioni di dominio specifiche ottimizzazioni del compilatore e runtime metaobject protocolli.

Altri suggerimenti

Questo è quello che si ottiene quando C++ soddisfa Riflessione:

C++ meets Reflection

Qualunque cosa scegliate, è probabilmente orribile macro, è difficile eseguire il debug di codice o strani passaggi di compilazione.Ho visto un sistema per generare automaticamente la messa in serie codice da DevStudio del file PDB.

Seriamente, però, per i piccoli progetti, sarà più facile da scrivere salvare/caricare le funzioni (o utilizzare gli operatori di flusso).In realtà, che potrebbe tenere per progetti di grandi dimensioni - è evidente quello che sta succedendo, e solitamente necessario modificare il codice in ogni caso, se le modifiche di struttura.

C'è un nuovo progetto di fornitura di riflessione in C++ utilizzando un metodo completamente differente: CAMP. https://github.com/tegesoft/camp

CAMP non utilizzare un precompilatore, le classi/proprietà/funzioni/...sono dichiarati manualmente utilizzando una sintassi simile a spinta.in pitone o luabind.Naturalmente, le persone possono utilizzare un precompilatore come gccxml o open-c++ per generare questa dichiarazione, se preferiscono.

E ' basato su C++ puro e aumentare solo le intestazioni, e grazie alla potenza del modello di meta-programmazione supporta qualsiasi tipo di associabili entità (eredità e strano costruttori non sono un problema, per esempio).

Viene distribuito sotto la licenza MIT (in precedenza LGPL).

Ho guardato queste cose per un bel po', ma tendono ad essere molto pesante.Si potrebbe evitare di usare l'ereditarietà, o avere strane costruttori etc etc.Alla fine hanno finito per essere troppo di un onere, invece di convenienza.

Questo approccio per esporre i membri che io uso è abbastanza leggero e ti permette di esplorare una classe per la serializzazione o l'impostazione di tutti i campi chiamato "x" 0, per esempio.È anche staticamente determinato modo è molto, molto veloce.No strati di libreria di codice o di una generazione di preoccuparsi di fare scherzi con il processo di costruzione.Si generalizza a gerarchie di tipi nidificati.

Impostare il vostro editor con un po ' di macro per automatizzare la scrittura di alcune di queste cose.

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

Guardò per un po ' troppo.L'attuale soluzione più semplice sembra essere BOOST_FUSION_ADAPT_STRUCT.Praticamente una volta che si dispone di una libreria/intestazione hai solo bisogno di aggiungere il tuo struct campi in BOOST_FUSION_ADAPT_STRUCT() la macro, come l'ultimo segmento di codice mostra.Sì ha delle restrizioni molte altre persone hanno detto.E non supporta gli ascoltatori direttamente.

Le altre soluzioni promettenti ho guardato dentro sono

  • CAMPO e XRTTI/gccxml, tuttavia sembra essere un ostacolo per portare gli strumenti esterni di dipendenza nel progetto.
  • Anni fa ho usato perl c2ph/pstruct per eseguire il dump di meta informazioni dai l'output di gcc -gstabs, che è meno invadente, ma ha bisogno di più lavoro se ha funzionato perfettamente per me.

Per quanto riguarda il boost/__cxa approccio, una volta a capire tutti i piccoli dettagli, l'aggiunta/modifica delle strutture o dei campi è di semplice manutenzione.attualmente utilizziamo per costruire una custom tipi di associazione strato di dbus, per serializzare le API e per nascondere il trasporto/RPC dettagli per un oggetto gestito il servizio di sottosistema.

Non una di carattere generale, ma QT supporta questa via una meta compilatore, ed è GPL.La mia comprensione di parlare con l'QT persone è che questo non è possibile con C++ puro, da qui la necessità per la moc.

Questo è un noto debolezza del linguaggio C++ in generale, perché le cose che avrebbe bisogno di essere standardizzata per fare una riflessione implementazioni portatile e la pena non sono standard.Convenzioni di chiamata, oggetto di layout, e simbolo di alterazione vengono in mente, ma ci sono anche gli altri.

La mancanza di direzione dalla standard significa che il compilatore implementatori di fare alcune cose in modo diverso, il che significa che pochissime persone hanno la motivazione a scrivere un portatile riflessione biblioteca, il che significa che le persone che hanno bisogno di riflessione, di re-inventare la ruota, ma solo quanto basta per ciò di cui hanno bisogno.Questo accade all'infinito, e qui ci sono.

Automatico introspezione, riflessione e toolkit.Utilizzare meta compilatore come Qt e l'aggiunta di meta-informazioni direttamente in file oggetto.Intuitiva e facile da usare.Senza dipendenze esterne.Anche consentire automaticamente riflettere std::string e quindi utilizzare negli script.Si prega di visitare il IDK

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top