Il modo migliore è creare esplicitamente un oggetto del tipo corretto std::function
poi passare tale oggetto alla funzione:
std::function<void(int, int)> func =
[](int a, int b) { cout << "a: " << a << " b: " << b << endl; }
foo(func);
o in linea:
foo(
std::function<void(int, int)>(
[](int a, int b) { cout << "a: " << a << "b: " << b << endl; }
));
std::function
ha un costruttore modello che accetta qualsiasi cosa:
template<class F> function(F);
A causa di ciò, il compilatore non può sapere durante la risoluzione di sovraccarico che è possibile selezionare foo
: sia std::function<void(int)>
sia std::function<void(int, int)>
hanno un costruttore che può assumere l'espressione lambda come argomento.
Quando si passa direttamente un oggetto std::function
, il costruttore di copia std::function
è preferito durante la risoluzione di sovraccarico, quindi viene selezionato al posto del modello di costruttore.
risposta per il futuro: Se l'elenco di cattura è garantito per essere vuota, è anche possibile utilizzare puntatori a funzione ordinarie. In C++ 0x, un lambda senza identificazione è implicitamente convertibile in un puntatore a funzione. Quindi, si può usare qualcosa di simile
void foo(void (*t)(int, int)) { t(1, 2); }
void foo(void (*t)(int)) { t(1); }
e chiamare foo
direttamente con la lambda captureless (o un puntatore a funzione con il tipo di corrispondenza).
Si noti che questa conversione è un'aggiunta molto recente alla bozza dello standard di lingua (è stata aggiunta nel febbraio di quest'anno), quindi non è probabile che sia ampiamente supportata ancora. Visual C++ 2010 non lo supporta ancora; Non so l'ultimo g ++.
Non esiste una funzione di fabbrica per 'std :: function', poiché l'inferenza di tipo è consentita sulle funzioni del modello ma non sulle classi di template? –
@ Ben: Non credo che una funzione di fabbrica sia valida in questo caso. Si consideri un oggetto funzione che ha due overload 'operator()'; come dovrebbe essere selezionato il tipo 'std :: function'? –
@James: oops, ho dimenticato che anche un lambda non catturante è un oggetto funzione. Esiste una funzione di fabbrica dai puntatori di funzione o l'ho completamente persa? –