Ich habe die Situation, dass eine Funktion eine von mehreren möglichen Funktionen aufruft. Dies scheint ein guter Ort zu sein, um eine Funktion als Parameter zu übergeben. In dieser Quoara-Antwort von Zubkov gibt es drei Möglichkeiten, dies zu tun.
int g(int x(int)) { return x(1); }
int g(int (*x)(int)) { return x(1); }
int g(int (&x)(int)) { return x(1); }
...
int f(int n) { return n*2; }
g(f); // all three g's above work the same
Wann sollte welche Methode angewendet werden? Was gibt es Unterschiede? Ich bevorzuge den einfachsten Ansatz. Warum sollte nicht immer der erste Weg verwendet werden?
In meiner Situation wird die Funktion nur einmal aufgerufen und ich möchte sie einfach halten. Ich habe es mit Pass-by-Zeiger arbeiten und ich rufe es einfach mit g(myFunc)
wo myFunc
ist die Funktion, die zuletzt aufgerufen wird.
c++
function
parameter-passing
Nordländer
quelle
quelle
g(+f);
funktioniert für die ersten beiden, aber nicht für die dritte.int g(int x(int))
,x
ist ein Zeiger , obwohl es nicht wie man sieht. Die entsprechende globale Deklarationint x(int);
deklariert eine Funktion, keinen Funktionszeiger.x
als Zeiger gekennzeichnet sind.Antworten:
Wenn Sie den Kommentar von LF erweitern, ist es oft besser, Funktionszeiger vollständig zu meiden und in Bezug auf aufrufbare Objekte (Dinge, die definieren
operator()
) zu arbeiten. Mit all den folgenden Optionen können Sie dies tun:Wichtig ist, dass all diese Funktionen für Lambda-Funktionen mit Captures verwendet werden können, im Gegensatz zu Ihren Optionen:
quelle
<algorithm>
diesen Ansatz verwenden, um Rückruffunktionen zu akzeptieren.g<int>(myFunc)
nurg(myFunc)
?