Reflection in C++
Von: VuuRWerK (vuurwerk@gmx.de) [Profil]
Datum: 06.05.2009 14:38
Message-ID: <46f19dff-74ef-4551-ab89-f9cfb2120c79@z5g2000vba.googlegroups.com>
Newsgroup: de.comp.lang.iso-c++
Datum: 06.05.2009 14:38
Message-ID: <46f19dff-74ef-4551-ab89-f9cfb2120c79@z5g2000vba.googlegroups.com>
Newsgroup: de.comp.lang.iso-c++
Hallo,
ich muss doch nochmal stören. Und wer jetzt glaubt es geht um pointer,
den muss ich enttäuschen :)
Ich suche nach einer Möglichkeit eine Art Reflection in C++ zu nutzen.
Dabei geht es mir nicht um Reflection im eigentlichen Sinne jedoch
gehört mein Wunsch mit in diese Kategorie :)
Ich möchte gern zur Laufzeit eine Klasse instanziieren und Methoden
dieser Klasse ausführen dessen Namen ich nur als String zur Verfügung
habe. Ein Vorteil wäre zum einen das sowohl die Klasse die es zu
instanziieren gilt im selben Kompilat ist wie die Funktion die dies
tut. D.h. kein wildes laden von libs oder sontigem (dazu hatte ich
schon was gefunden: boost::extension::shared_library (Link siehe unten
zum Thema boost::reflection)).
Ich hab mich einfach mal ganz naiv rangesetzt und kurz was in Code
verfasst um besser zu beschreiben was ich gern haben möchte, versteht
es mehr als Pseudocode ;)
=========================
====================
struct reflection;
template< class T >
struct reflectable
{
reflectable(std::string const& class_name)
{ reflection::reflection_map.insert(std::make_pair(class_name,
*this)); }
T* new_instance() const
{ return new T; }
};
struct reflection
{
template< class T > T*
reflect(std::string const& class_name)
{ return reflection_map[class_name].new_instance(); }
static std::map< std::string, reflectable > reflection_map;
};
struct a
: public reflectable< a >
{
a()
: reflectable("a") {}
virtual ~a() {}
void
val(std::string const& new_val)
{ val_ = new_val; }
std::string const&
val() const
{ return val_; }
private:
std::string val_;
};
=========================
====================
Jetzzt würde ich es gern wie folgt benutzen:
=========================
====================
int main(int argc, char* argv[]) {
a* obj = reflection::reflect("a");
obj->val("a string");
std::cout << obj->val() << std::endl; // Output: "s string"
return 0;
}
=========================
====================
Wichtig: in der main kann ich jetzt nicht den Header includieren in
der sich die klasse a befindet, da ich "eigentlich" gar nicht weiß das
die Klasse so heist :)
Ich hab natürlich schon gesucht danach und auch viele Ansätze und
Lösungen gefunden aber in keiner konnte ich so recht einen Ansatz
dafür finden es in etwa so zu benutzen wie oben beschrieben. Sehr
angetan war ich von der Umsetzung von boost::reflection (http://boost-
extension.blogspot.com/) jedoch fand ich kein Beispiel wo ich eine
Klasse anhand des Namens als String instantiieren kann und eine
Methode aufrufen wo ich ebenfalls nur den String als Namen habe. Dann
habe ich auch eine sehr schöne Ausarbeitung über die Thematik
gefunden: http://www.vollmann.com/pubs/meta/meta/meta.html aber auch
hier find ich nicht so recht einen Ansatz (ich gebe zu nicht alles
komplett gelesen zu haben aber ich habe mir den Code und die Beispiele
angeschaut!).
Vielleicht habt ihr ja eine Idee wie man das lösen könnte? Ausflösen
der Reflection zur Compile-Time könnte vielleicht noch möglich sein,
ich denk dabei an Template-Programmierung. Ich wäre ebenfalls bereit
zusätzlichen Aufwand an Code in die Klasse zu schreiben die es zu
reflecktieren gilt, ich will erstmal nichts ausschließen.
Danke schonmal für Eure Geduld ;)
Grüße
Christian
[ Auf dieses Posting antworten ]Antworten
- Christoph Rabel (06.05.2009 16:06)
- Christian Seifert (06.05.2009 23:55)
- Christof Donat (07.05.2009 15:30)
- Christian Seifert (07.05.2009 23:09)
- André Schreiter (08.05.2009 13:38)
- Christian Seifert (08.05.2009 15:20)
- André Schreiter (08.05.2009 16:16)
- Christof Donat (09.05.2009 13:32)
- Stefan Ram (09.05.2009 15:12)
- Stefan Ram (09.05.2009 16:35)
- Christof Donat (09.05.2009 20:04)
- Christof Donat (08.05.2009 15:00)
- Stefan Reuther (08.05.2009 18:58)
- Christof Donat (09.05.2009 13:38)
- Christoph Rabel (07.05.2009 15:49)
- Rüdiger Ranft (07.05.2009 08:27)
