你有两个选择,要么使用函子,要么使用 lamdas。
使用仿函数,您可以创建一个新类(或结构),其构造函数采用您要搜索的字符串,然后它有一个由以下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"));
第二个使用 lambdas 的代码更少,但需要可以处理C++11 lambdas的最新版本的编译器:
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"));
这样 lambda 可以被重用。