Attualmente sto facendo alcuni esercizi con funzioni basate su modelli. Avevo il compito di scrivere un'implementazione dell'algoritmo di trasformazione. ho fatto come il seguente e funziona:lambda con modelli
template <class in, class out, class T>
out stransform(in b, in e, out d, T p(const T&)) {
while (b != e)
*d++ = p(*b++);
return d;
}
Come per il normale trasformare devo chiamare il predicato con un tipo esplicito come
stransform(begin(vec1), end(vec1), back_inserter(vec2), predi<double>);
Ora, sono incappato in C++ 11 lambda e voleva chiamare la mia funzione come questa:
stransform(begin(vec1), end(vec1), back_inserter(vec2), [] (double x) ->double {return x * 10;});
Con che faccio un errore di compilatore che il tipo cant essere dedotta. Questa è la cosa che non capisco dato che sto definendo il tipo T nel mio lambda in realtà due volte.
Ho controllato anche la funzione di trasformazione originale, con cui sta funzionando. Ho quindi controllato lo implementation di quello ed è ovviamente implementato con una classe template per l'intera funzione. È il modo corretto di implementare predicati con i modelli?
Ho pensato così dopo aver letto l'implementazione della trasformazione, che lo rende anche molto più semplice. Mi chiedo ancora perché non lavoro nell'altro caso. – inf
@bamboon Immagino perché un lambda non è una funzione ma un oggetto funzione, in quanto può anche contenere lo stato (è una chiusura e non solo una funzione). –
Si noti che un lambda che non esegue alcuna cattura è convertibile in una funzione ordinaria (puntatore). – spraff