Q:

Функторы и операторы в C++

Я не могу до конца понять, как работает operator() внутри класса и, в принципе, в чем его отличие от методов.
То есть в чем разница между 
class ManOlderThan
{
    int m_age;
public:
    ManOlderThan( int age )
    {
        m_age = age;
    };
    bool operator()( Man &man )
    {
        if( man.GetAge() > m_age ) {
            return true;
        }
        else {
            return false;
        }
    };
};

class ManOlderThan
{
    int m_age;
public:
    ManOlderThan( int age )
    {
        m_age = age;
    };
    bool compare( Man &man )
    {
        if( man.GetAge() > m_age ) {
            return true;
        }
        else {
            return false;
        }
    };
};

В том, как потом это вызывать? Или оператор нужен, когда метод только один? Или это вообще разные вещи?
Вообще в данном случае оператор рассматривается в контексте векторов и for_each и find_if

A:

Многие алгоритмы используют функциональные объекты для обработки элементов последовательности. В качестве этих функциональных объектов могут выступать функции или классы, имеющие оператор-функцию. Синтаксис вызова для функций и классов - функциональных объектов выглядит идентично. Это позволяет писать обобщенный код. Преимущество классов - функциональных объектов состоит в том. что они позволяют хранить состояние, а также использовать дополнительные поля данных помимо аргументов вызова.
Посмотрите ниже демонстрационную программу, которая находит человека с возрастом больше заданного. Как видно из примера, использование функционального оператора-функции вместо вызова функции-члена класса значительно проще, а также функциональный объект может хранить дополнительную информацию - в данном случае значение 35.
#include <iostream>
#include <vector>
#include <algorithm>

class ManOlderThan
{
    int m_age;
public:
    ManOlderThan( int age ) : m_age( age )
    {
    }

    int GetAge() const 
    {
        return m_age;
    }

    bool operator ()( const ManOlderThan &man ) const
    {
        return m_age < man.GetAge();
    }

    bool compare( const ManOlderThan &man ) const
    {
        return m_age < man.GetAge();
    }
};

int main() 
{
    std::vector<ManOlderThan> v = { 20, 30, 40, 50, 60 };

    auto man = std::find_if( v.begin(), v.end(), ManOlderThan( 35 ) );

    std::cout << man->GetAge() << std::endl;

    man = std::find_if( v.begin(), v.end(), 
                        []( const ManOlderThan &man  )
                        {
                            return ManOlderThan( 35 ).compare( man );
                        } );

    std::cout << man->GetAge() << std::endl;

    return 0;
}

Вывод программы на консоль
40
40

То есть программа ищет первого человека в списке людей, заданного вектором, который старше 35 лет.

