Funktion nach Wert (?) anstelle von Funktionszeiger übergeben?

8

Es tut mir leid, wenn das schon einmal gefragt wurde, aber ich konnte es nicht finden.

Ich versuche also, mich über Vorlagen und die neuen C ++ 11-Funktionen (hauptsächlich Lambdas, was ich in anderen Sprachen immer gemocht habe) zu informieren.

Aber in meinen Tests kam ich zu etwas, von dem ich nicht wusste, dass es funktionierte, und ich versuche zu verstehen, wie es funktioniert, kann es aber nicht herausfinden.

Der folgende Code:

%Vor%

Wenn ich verstehe, wie Templates funktionieren, sind sie im Grunde ein Schema für den Compiler, um zu wissen, was zu erstellen ist, also der erste Aufruf Test( &Callback ); , von dem ich erwartet habe, dass er funktioniert Angenommen, die Argumente sollten ein Zeiger sein.

Aber was ist der zweite Anruf? Was ist die Vorlage, wenn man davon ausgeht? Eine Kopie einer Funktion (wenn das überhaupt Sinn macht)?

    
sap 18.08.2011, 17:02
quelle

4 Antworten

14

Eine Funktion ist implizit in einen Zeiger auf sich selbst umwandelbar; Diese Konvertierung findet praktisch überall statt. Test(Callback) ist genau dasselbe wie Test(&Callback) . Es gibt keinen Unterschied. In beiden Fällen wird Func zu void(*)(int) abgeleitet.

Funktionszeiger sind seltsam. Sie können mehr darüber in " Warum funktionieren all diese verrückten Funktionszeiger-Definitionen? "

    
James McNellis 18.08.2011, 17:03
quelle
3

In C ++ sind Funktionen keine Objekte der ersten Klasse, was bedeutet, dass "Funktion als Wert" darin keinen Sinn macht. Deshalb ist der Funktionsname implizit immer in Zeiger umgewandelt worden.

    
hamstergene 18.08.2011 17:08
quelle
2

Funktionen sind implizit in Funktionszeiger umwandelbar. In der Tat gibt es keine Möglichkeit, einen Funktionswert oder eine Referenz zu erhalten. Obwohl Sie seltsamerweise einen Funktionswerttyp erstellen können, können Sie ihm einfach nichts zuweisen.

Hier ist Code Snippit , der demonstriert, wie Lambdas und verschiedene Callbacks mit Vorlagen reagieren.

    
deft_code 18.08.2011 17:21
quelle
0

In C ++ 11 (und boost und tr1) haben wir die std :: -Funktion als Template-Typ zum Speichern von Funktoren, Lambdas und Funktionen. So können Sie definitiv das Konzept haben, einen Funktionswert in einer Variablen vom Typ std :: function zu behalten. Diese Variable kann auch "leer" sein, was bedeutet, dass keine Funktion (Referenz) darin gespeichert ist. Dann kann es nicht angerufen werden.

Die ursprüngliche Frage bezieht sich darauf, dass im Gegensatz zu C, C ++ Funktionsreferenzen erlaubt. Außerdem kann ein Funktionsname aus Kompatibilitätsgründen mit C zu einem Funktionszeiger werden. Aber wegen Überlastung sind die Dinge in C ++ "interessanter" als in C.

    
PeterSom 20.10.2011 08:47
quelle

Tags und Links