001
31.03.2010, 20:04 Uhr
0xdeadbeef
Gott (Operator)
|
Nicht direkt, nein. Was geht, ist ein Funktionszeiger, etwa
C++: |
void (*fptr)() = &f_a;
// ...
fptr();
|
Dementsprechend kann man Strings dann auf Funktionen mappen, beispielsweise
C++: |
std::map<std::string, void(*)()> func_map;
func_map["f_a"] = &f_a;
std::map<std::string, void(*)()>::const_iterator i = func_map.find("f_a");
if(i != func_map.end()) { (*i)(); }
|
Das ganze lässt sich dann schön verpacken, beispielsweise (jetzt mit std::tr1::function statt rohen Funktionszeigern)
C++: |
class reflector { public: reflector();
void call(std::string const &name) const;
private: std::map<std::string, std::tr1::function<void()> > funcs_; };
reflector::reflector() { funcs_["f_a"] = &f_a; funcs_["f_b"] = &f_b;
// Denkbar hier im einfachsten Fall eine Makrokonstruktion der Art #define REGISTER_FUNCTION(name) funcs_[ #name ] = &name REGISTER_FUNCTION(f_c); REGISTER_FUNCTION(f_d); #undef REGISTER_FUNCTION }
void reflector::call(std::string const &name) const { std::map<std::string, std::tr1::function<void()> >::const_iterator i = funcs_.find(name);
if(i != funcs_.end()) { (*i)(); } else { throw std::invalid_argument("Unbekannte Funktion: " + name); } }
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 31.03.2010 um 20:07 Uhr von 0xdeadbeef editiert. |