Como dijiste, bind y lambdas no apuntan exactamente al mismo objetivo.
Por ejemplo, para usar y componer algoritmos STL, las lambdas son claras ganadoras, en mi humilde opinión.
Para ilustrar, recuerdo una respuesta muy divertida, aquí en desbordamiento de pila, donde alguien pidió ideas de números mágicos hexagonales (como 0xDEADBEEF, 0xCAFEBABE, 0xDEADDEAD etc.) y se le dijo que si fuera un verdadero programador de C++ él simplemente tendría descargar una lista de palabras en inglés y el uso de un sencillo de una sola línea de C++ :)
#include <iterator>
#include <string>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
int main()
{
using namespace boost::lambda;
std::ifstream ifs("wordsEn.txt");
std::remove_copy_if(
std::istream_iterator<std::string>(ifs),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, "\n"),
bind(&std::string::size, _1) != 8u
||
bind(
static_cast<std::string::size_type (std::string::*)(const char*, std::string::size_type) const>(
&std::string::find_first_not_of
),
_1,
"abcdef",
0u
) != std::string::npos
);
}
Este fragmento, en C++ puro 98, abra el archivo de palabras en inglés, escanear cada palabra e imprimir solamente los de longitud 8 con letras 'a', 'b', 'c', 'd', 'e' o 'f'.
Ahora, encienda C++ 0X y lambda:
#include <iterator>
#include <string>
#include <algorithm>
#include <iostream>
#include <fstream>
int main()
{
std::ifstream ifs("wordsEn.txt");
std::copy_if(
std::istream_iterator<std::string>(ifs),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, "\n"),
[](const std::string& s)
{
return (s.size() == 8 &&
s.find_first_not_of("abcdef") == std::string::npos);
}
);
}
Esto sigue siendo un poco pesado para leer (sobre todo por el negocio istream_iterator), pero mucho más simple que la versión unen :)
¿hay alguna diferencia de rendimiento? velocidad, consumo de memoria, uso del montón? –
@Caspin Realmente no sé si hay una diferencia en el rendimiento/consumo de memoria entre estas dos herramientas :) – AraK
por cierto: las dos versiones no son equivalentes porque obligan a copiar los argumentos. Alternativa: enlace (ref (distribución), ref (motor)) – sellibitze