Страницы

Поиск по вопросам

вторник, 5 марта 2019 г.

Функторы и операторы в 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


Ответ

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

Комментариев нет:

Отправить комментарий