Ho notato che lambdas funzionano entrambi utilizzando i puntatori di funzione e il tipo dedicato function
utilizzando g++
.Quale modo di invocare lambda in C++ è il più idiomatico?
#include <functional>
typedef int(*fptr)(int, int);
int apply_p(fptr f, int a, int b) {
return f(a, b);
}
int apply_f(std::function<int(int, int)> f, int a, int b) {
return f(a, b);
}
void example() {
auto add = [](int a, int b) -> int {
return a + b;
};
apply_p(add, 2, 3); // doesn't give an error like I'd expect it to
apply_f(add, 2, 3);
}
La mia domanda è: quali di questi sono più idiomatici da usare? E quali sono i pericoli e/oi benefici dell'usare l'uno sull'altro?
Correlato a [questa domanda] (http://stackoverflow.com/q/26748736/1708801) chiesto oggi.La conversione al puntatore funzione funziona solo se lambda non ha acquisito. Come risposta c'è un'altra alternativa che usa un modello e tratta il lambda come un Callable. 'std :: function' incorre in overhead e non può essere ottimizzato come una lambda can. –
La seconda versione potrebbe comportare un sovraccarico non necessario. Vorrei invece applicare 'apply_f' a un template di funzione. – juanchopanza
@ShafikYaghmour wow .. tempismo casuale –