Как вы сказали, бинды и лямбды не совсем нацелены на одну и ту же цель.
Например, для использования и составления алгоритмов STL, лямбды - явные победители, ИМХО.
Чтобы проиллюстрировать, я помню очень забавный ответ, здесь о переполнении стека, когда кто-то спрашивал идеи о шестнадцатеричных магических числах (например, 0xDEADBEEF, 0xCAFEBABE, 0xDEADDEAD и т. Д.) И ему говорили, что если он будет настоящим программистом C ++, он просто скачал бы список английских слов и использовал бы простой однострочный текст 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
);
}
Этот фрагмент, в чистом C ++ 98, открывает файл английских слов, сканирует каждое слово и печатает только слова длиной 8 с «a», «b», «c», «d», «e» или буквы 'f'.
Теперь включите C ++ 0X и лямбду:
#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);
}
);
}
Это все еще немного тяжело для чтения (в основном из-за бизнеса istream_iterator), но намного проще, чем версия bind:)