Подтвердить что ты не робот

Операция С++ Operator() с пересылкой скобок

Недавно я задал вопрос об удалении элементов из вектора. Ну, решение, которое я получил, работает, но я этого не понимаю - и я не могу найти никакой документации, объясняющей это.

struct RemoveBlockedHost {
    RemoveBlockedHost(const std::string& s): blockedHost(s) {}

    // right here, I can find no documentation on overloading the () operator
    bool operator () (HostEntry& entry) { 
        return entry.getHost() == blockedHost || entry.getHost() == "www." + blockedHost;
    }
    const std::string& blockedHost;
};

который будет использоваться как:

hosts.erase(std::remove_if(hosts.begin(), hosts.end(), RemoveBlockedHost(blockedhost)), hosts.end());

Я посмотрел документацию std:: remove_if, он говорит, что можно передать класс вместо функции только тогда, когда класс перегружает оператор(). Нет никакой информации.

Кто-нибудь знает ссылки на:

  • Книга, содержащая примеры/объяснения
  • Или ссылка на онлайн-документацию/учебники

Помощь с этим будет оценена по достоинству. Мне не нравится добавлять код в мое программное обеспечение, если я его не понимаю. Я знаю, что это работает, и я знаком (несколько) с перегрузкой оператора, но я не знаю, для чего работает оператор().

4b9b3361

Ответ 2

Это функционал, ну на самом деле функтор. Но в FAQ все объясняется:

Функциональные функции - это функции на стероиды. Функциональные функции строго более мощные, чем функции, и что дополнительная мощность решает некоторые (не все) проблемы, с которыми обычно сталкиваются, когда вы используете указатели функций.

https://isocpp.org/wiki/faq/pointers-to-members#functionoids

Ответ 3

Узнайте больше о Functors Класс, который перегружает оператор Function(), называется Functor. Любая достойная книга на С++ с объяснением в STL будет иметь информацию об этом.
Здесь - ссылка, на которую вы можете ссылаться.

Ответ 4

Я хотел бы указать, что после С++ 11 вы можете избежать необходимости что-то вроде этого с помощью лямбда:

hosts.erase(std::remove_if(hosts.begin(), hosts.end(),
    [&blockedhost](HostEntry& entry) -> bool {
        return entry.getHost() == blockedHost || entry.getHost() == "www." + blockedHost;
    }), hosts.end());