325 Stimmen

Wie kann ich Reflection zu einer C++-Anwendung hinzufügen?

Ich möchte in der Lage sein, eine C++-Klasse auf ihren Namen, ihren Inhalt (d.h. Mitglieder und ihre Typen) usw. zu untersuchen. Ich spreche hier von nativem C++, nicht von verwaltetem C++, das Reflection hat. Ich weiß, dass C++ mit RTTI einige begrenzte Informationen liefert. Welche zusätzlichen Bibliotheken (oder andere Techniken) könnten diese Informationen liefern?

21 Stimmen

Pech gehabt, ohne Makros und andere Vorverarbeitungen geht es nicht, denn die erforderlichen Metadaten gibt es nicht es sei denn, Sie erstellen sie manuell mit Hilfe von Makro-Vorverarbeitungsmagie.

7 Stimmen

Die Informationen, die Sie von RTTI erhalten können, reichen jedoch nicht aus, um die meisten Dinge zu tun, für die Sie eigentlich eine Reflexion benötigen würden. Sie können zum Beispiel nicht über die Mitgliedsfunktionen einer Klasse iterieren.

1voto

nnolte Punkte 1498

Sie können coole statische Reflexionsfunktionen für Structs mit BOOST_HANA_DEFINE_STRUCT aus der Boost::Hana-Bibliothek.
Hana ist sehr vielseitig, nicht nur für den Anwendungsfall, der Ihnen vorschwebt, sondern auch für eine Vielzahl von Template-Metaprogrammierungen.

0voto

S.S. Anne Punkte 14362

Wenn Sie einen Zeiger auf eine Funktion wie diese deklarieren:

int (*func)(int a, int b);

Sie können dieser Funktion wie folgt einen Speicherplatz zuweisen (erfordert libdl y dlopen )

#include <dlfcn.h>

int main(void)
{
    void *handle;
    char *func_name = "bla_bla_bla";
    handle = dlopen("foo.so", RTLD_LAZY);
    *(void **)(&func) = dlsym(handle, func_name);
    return func(1,2);
}

Um ein lokales Symbol mittels Indirektion zu laden, können Sie dlopen auf der aufrufenden Binärdatei ( argv[0] ).

Die einzige Voraussetzung hierfür ist (abgesehen von dlopen() , libdl y dlfcn.h ) ist die Kenntnis der Argumente und des Typs der Funktion.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X