Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Variabler Funktionsaufruf?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
31.03.2010, 15:22 Uhr
~D3VN3W
Gast


Ok ich halte die Frage so kurz wie möglich:

Ist es möglich in einem std::string einen funktionsnamen zu speichern und diese dann später auszuführen?

mein versuch war:


Code:

void f_a(){};

void exec_func(void varfunc())
{
     varfunc();
}



int main()
{
std::string funkname;
funkname="f_a";
     exec_func(funkname);

};



Aber eben so geht dass nicht weil
cannot convert `std::string' to `void*' in argument passing

Weiß jmd Rat?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.04.2010, 18:02 Uhr
~D3VN3W
Gast


Danke 0xdeadbeef, es ist wirklich super wie schnell mir hier geholfen wurde. Grüße D3Vn3W
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.06.2010, 20:15 Uhr
~alkololl
Gast


hey
ich hab den code, wie du ihn gepostet hast in meinem programm eingefügt und bekomme leider vom server viele fehler :/ muss ich was spezielles includen?
mfg alkololl
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.06.2010, 21:26 Uhr
0xdeadbeef
Gott
(Operator)


<map>, <string> und für die std::tr1::function-Variante <tr1/functional> (gcc) bzw. <functional> (msvc ab 2008).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: