Перегрузка скобок в C ++ Operator () - PullRequest
11 голосов
/ 31 марта 2011

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

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, в которой говорится, что вместо функции можно передавать класс, только когда класс перегружает оператор (). Никакой информации.

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

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

Ответы [ 4 ]

11 голосов
/ 31 марта 2011

Это называется функтором в C ++

Этот ответ имеет хороший пример и т. Д.

Функторы C ++ - и их использование

2 голосов
/ 31 марта 2011

Это функционоид, ну, на самом деле, функтор. Но часто задаваемые вопросы объясняют все это:

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

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

1 голос
/ 31 марта 2011

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

0 голосов
/ 22 июня 2016

Я хотел бы отметить, что после C ++ 11 вы можете избежать необходимости чего-то подобного с лямбдой:

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