带有 operator() 的类(Functors)
每个重载 operator()
的类都可以用作函数对象。这些类可以手工编写(通常称为仿函数),也可以由编译器通过从 C++ 11 编写 Lambdas 自动生成。
struct Person {
std::string name;
unsigned int age;
};
// Functor which find a person by name
struct FindPersonByName {
FindPersonByName(const std::string &name) : _name(name) {}
// Overloaded method which will get called
bool operator()(const Person &person) const {
return person.name == _name;
}
private:
std::string _name;
};
std::vector<Person> v; // Assume this contains data
std::vector<Person>::iterator iFind =
std::find_if(v.begin(), v.end(), FindPersonByName("Foobar"));
// ...
由于仿函数有自己的身份,因此不能将它们放入 typedef 中,这些都必须通过模板参数接受。std::find_if
的定义如下:
template<typename Iterator, typename Predicate>
Iterator find_if(Iterator begin, Iterator end, Predicate &predicate) {
for (Iterator i = begin, i != end, ++i)
if (predicate(*i))
return i;
return end;
}
从 C++ 17 开始,可以使用 invoke:std::invoke(predicate, *i)
来调用谓词。