Я не могу до конца понять, как работает 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
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
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 лет.
Комментариев нет:
Отправить комментарий