ファンクターまたはラムダを使用する 2 つのオプションがあります。
operator()
ファンクターを使用して、コンストラクターが検索する文字列を受け取る新しいクラス (または構造体) を作成し、次のように呼び出される関数を持ちますstd::find_if
。
class my_finder
{
std::string search;
public:
my_finder(const std::string& str)
: search(str)
{}
bool operator()(const MyStruct* my_struct) const
{ return search == my_struct->name; }
};
// ...
std::find_if(std::begin(...), std::end(...), my_finder("XYZ"));
ラムダを使用する 2 番目はコードが少なくなりますが、C++11 ラムダを処理できる最新バージョンのコンパイラが必要です。
std::find_if(std::begin(...), std::end(...), [](const MyStruct* my_struct)
{ return std::string("XYZ") == my_struct->name; });
最後の例は、さらに一般化することもできます。
using namespace std::placeholders; // For `_1` used below in `std::bind`
// Declare a "finder" function, to find your structure
auto finder = [](const MyStruct* my_struct, const std::string& to_find) {
return to_find == my_struct->name;
};
auto xyz = std::find_if(std::begin(...), std::end(...), std::bind(finder, _1, "XYZ"));
auto abc = std::find_if(std::begin(...), std::end(...), std::bind(finder, _1, "ABC"));
このようにして、ラムダを再利用できます。