あなたが言ったように、バインドとラムダはまったく同じ目標を目指しているわけではありません。
たとえば、STL アルゴリズムを使用および構成する場合、ラムダは明らかに勝者です。
たとえば、スタック オーバーフローに関する非常に面白い回答を覚えています。誰かが 16 進数のマジック ナンバー (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 で、英単語ファイルを開き、各単語をスキャンして、'a'、'b'、'c'、'd'、'e'、または 'f' を含む長さ 8 の単語のみを出力します。文字。
次に、C++0X と 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);
}
);
}
これはまだ読むのが少し重いですが (主に istream_iterator ビジネスのため)、バインド バージョンよりもずっと簡単です :)