2016-03-18 4 views
9

Qualcosa di simile a quanto segue:Posso definire un puntatore a funzione che punta a un oggetto di tipo std :: function?

#include <functional> 

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

Gli errori che ricevo sono

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 

un modo più diretto per andare da funzione lambda a funzionare puntatore sarebbe utile sapere come bene.

+1

Avete bisogno di std: : funzione o stai solo cercando di ottenere un puntatore a un lambda (senza cattura)? – Mat

+2

No. I puntatori funzione puntano a funzioni, non oggetti che si comportano come funzioni. – Galik

+0

@ Mat originariamente ero interessato al lambda senza cattura. Non sono sicuro che le funzioni lambda si comporterebbero come un rvalue rendendo i puntatori impossibili. – roro

risposta

19
int* Fptr(int) 

dichiara una funzione "fptr" che prende un int e restituisce int*.

Una dichiarazione di puntatore di funzione appare come

int (*Fptr)(int) 

Inoltre, std::function<int(int)> non è il tipo di funzione lambda, ma la funzione lambda può essere implicitamente convertito a quel tipo.

Fortunatamente, una (non-cattura) funzione lambda possono anche essere implicitamente convertito in un puntatore a funzione, quindi il modo più diretto possibile dalla funzione lambda a funzionare puntatore è

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

Wow, +1 per il fatto che un lambda non catturante può essere trattato come un puntatore a funzione, bello sapere. – skypjack