[Gelöst] Frage zur Übergabe von Funktionen als Parameter
-
Im Buch "Thinking in C++" ist folgendes Beispiel gegeben:
template<class Seq, class T, class R, class A> void apply(Seq& sq, R(T::*f)(A), A a) { typename Seq::iterator it = sq.begin(); while(it != sq.end()) { ((*it)->*f)(a); it++; } } class Gromit { int arf; public: Gromit(int arf = 1) : arf(arf + 1) {} void speak(int) { for(int i = 0; i < arf; i++) std::cout << "arf! "; std::cout << std::endl; } } int main() { g(f); vector<Gromit*> dogs; for(int i = 0; i < 5; i++) dogs.push_back(new Gromit(i)); apply(dogs, &Gromit::speak, 1); }Meine Frage ist nun, warum man einen Zeiger auf eine Funktion übergeben muss. Wenn man bei der apply-Definition die Sternchen vor f löscht und beim apply-Aufruf in der main() das &-Zeichen weglässt, kompiliert das Programm nicht mehr. Im Allgemeinen kann man aber Funktion auch so übergeben (also ohne Zeiger). Warum ist das so?
-
Gromit::speak ist kein gueltiger Ausdruck und R (T::) (A) kein gueltiger Typ.
-
::* ist ein einziger Operator, nicht etwa zwei Operatoren (:: und
hintereinander. Lässt du den Stern weg, ändert sich die Bedeutung völlig.
Ein Zeiger auf Member(-funktion) ist kein Zeiger.Ramanujan schrieb:
Im Allgemeinen kann man aber Funktion auch so übergeben (also ohne Zeiger).
Wird bei einem Funktionsparameter ein Funktionstyp angegeben, wird diese Dekalartion automatisch vom Compiler umgewandelt in eine, die einen Zeiger deklariert ganz analog zu Arrayparametern, die in Zeiger-auf-Element umgewandelt werden.
Es handelt sich hier also nur um eine syntaktische Vereinfachung.
-
Ok, thx.