Si consideri il seguente esempiosovraccarico Funzione funzione utilizzando lambda firma
void foo(const std::function<int()>& f) {
std::cout << f() << std::endl;
}
void foo(const std::function<int(int x)>& f) {
std::cout << f(5) << std::endl;
}
int main() {
foo([](){return 3;});
foo([](int x){return x;});
}
Questo non si compila, perché la chiamata a foo
si dice che sia ambiguo. Per quanto ho capito, questo è dovuto al fatto che la funzione lambda non è a priori un std::function
ma deve essere castata ad esso e che esiste un costruttore std::function
che accetta un argomento arbitrario.
Forse qualcuno può spiegarmi perché qualcuno dovrebbe creare un costruttore implicito che accetta un argomento arbitrario. Tuttavia, la mia domanda acuta è se esiste una soluzione alternativa, che consente di utilizzare la firma della funzione delle funzioni lambda per sovraccaricare una funzione foo
. Ho provato i puntatori di funzione, ma ciò non ha funzionato perché non è possibile eseguire il cast delle funzioni lambda su un normale puntatore a funzione.
Qualsiasi aiuto è più che benvenuto.
Questo è probabilmente un bug in MSVC. Funziona in Clang/GCC. –
Oh Microsoft, sei così divertente –
[Works for me] (http://ideone.com/XmAgLG). Quale compilatore stai usando? –