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?
Antworten
Zu viele Anzeigen?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.
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.
- See previous answers
- Weitere Antworten anzeigen
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.