帶有 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) 來呼叫謂詞。