2016-03-18 3 views
9

Etwas wie folgt aus:Kann ich einen Funktionszeiger definieren, der auf ein Objekt vom Typ std :: function zeigt?

#include <functional> 

int main() 
{ 
    std::function<int(int)> func = [](int x){return x;}; 
    int* Fptr(int) = &func; //error 
} 

Die Fehler, die ich sind erhalten

temp.cpp: In function ‘int main()’: 
temp.cpp:6:15: warning: declaration of ‘int* Fptr(int)’ has ‘extern’ and is initialized 
    int* Fptr(int) = &func; //error 
      ^
temp.cpp:6:20: error: invalid pure specifier (only ‘= 0’ is allowed) before ‘func’ 
    int* Fptr(int) = &func; //error 
        ^
temp.cpp:6:20: error: function ‘int* Fptr(int)’ is initialized like a variable 

Ein direkterer Weg von Lambda-Funktion gehen Zeiger funktionieren würde nützlich sein, als gut zu kennen.

+1

Haben Sie die std benötigen: : Funktion oder versuchen Sie nur einen Funktionszeiger auf ein (Capture-less) Lambda zu bekommen? – Mat

+2

Nein. Funktionszeiger zeigen auf Funktionen, nicht Objekte, die sich wie Funktionen verhalten. – Galik

+0

@Mat Ursprünglich interessierte mich Capture-less Lambda. Ich bin mir nicht sicher, ob sich Lambda-Funktionen wie ein R-Wert verhalten würden, der Zeiger unmöglich macht. – roro

Antwort

19
int* Fptr(int) 

deklariert eine Funktion "fptr", die eine int nimmt und int*.

Eine Funktionszeigerdeklaration sieht aus wie

int (*Fptr)(int) 

Ferner std::function<int(int)> nicht die Art Ihrer Lambda-Funktion ist, aber Ihre Lambda-Funktion kann implizit in diesem Typ konvertiert werden.

Zum Glück, eine (nicht-Capturing) Lambda-Funktion kann auch implizit in einen Funktionszeiger umgewandelt werden, so dass der direkteste Weg von Lambda-Funktion Zeiger auf Funktion ist

int (*Fptr)(int) = [](int x){return x;}; 
+2

Wow, +1 für die Tatsache, dass ein nicht erfassendes Lambda wie ein Funktionszeiger behandelt werden kann, schön zu wissen. – skypjack

Verwandte Themen