Funktion mit bestimmten Paramtern woanders aufrufen
-
Hallo, ich würde gerne eine Funktion mit bestimmten Parametern von einem anderen Objekt später aufrufen lassen. Ist das irgendwie möglich?
Ich bin auf boost::function gestoßen aber damit erhalte ich nur einen Zeiger auf die Funktion und die Parameter müssen nochmal vom aufrufenden Objekt gesetzt werden.Also im groben:
void klasse1::func1() { TypX zeiger = erzeuge Zeiger auf func2 mit Parameter 1 und 2 klasse2::func3(zeiger) } void klasse1::func2(int a, int b) { int c = a + b; } void klasse2::doIt() { liste.front()->führeFunktionMitParameterAus() } void klasse2::addTypX(TypX zeiger) { liste.push_back(zeiger); }
-
-
Dann stoß auch mal auf boost::bind.
edit: Zu langsam.
-
Wenn dein "liste" ein STL-Container ist, und ich dein Vorhaben richtig deute, dann sollte das per Prädikat funktionieren was du möchtest.
Edith weiß noch zu sagen: Und wenn es kein STL-Container ist, wurde boost::bind ja schon gefunden. (auch zu langsam
)
-
Vielen Dank für die schnellen Antworten.
Auf boost::bind bin ich vorher auch schon gestoßen aber wird die im bind definierte Funktion nicht bei der Übergabe schon direkt ausgeführt?
Ich müsste ja das boost::bind in eine Liste speichern und zu einem späteren Zeitpunkt ausführen.
-
storm009 schrieb:
Auf boost::bind bin ich vorher auch schon gestoßen aber wird die im bind definierte Funktion nicht bei der Übergabe schon direkt ausgeführt?
Ich müsste ja das boost::bind in eine Liste speichern und zu einem späteren Zeitpunkt ausführen.
Nein.. wird nicht direkt ausgeführt... genau dafür ist boost::bind!
Edit:
class klasse1; class klasse2 { typedef function<void()> function_t; public: void doIt() { if (!liste.empty()) (liste.front())(); } void addTypeX(function_t func) { liste.push_back(func); } private: std::list<function_t> liste; }; class klasse1 { klasse2& xyz; public: explicit klasse1(klasse2 &ref) : xyz(ref) { } void func1() { xyz.addTypeX(bind(&klasse1::func2, this, 1, 2)); } void func2(int a, int b) { int c = a + b; std::cout << a << "+" << b << "=" << c << std::endl; } }; int main (void) { klasse2 foo; klasse1 bar(foo); bar.func1(); foo.doIt(); }
-
Super!!! Vielen Dank für das Beispiel.