C ++ Operator()括号重载

时间:2011-03-31 16:55:17

标签: c++ operator-overloading remove-if

我最近问了一个关于从矢量中删除项目的问题。好吧,我得到的解决方案有效,但我不明白 - 我找不到任何解释它的文档。

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 个答案:

    答案 0 :(得分:11)

    它在C ++中被称为仿函数

    这个答案有一个很好的例子等等。

    C++ Functors - and their uses

    答案 1 :(得分:2)

    这是一个功能,实际上是一个算子。但常见问题解答解释了这一切:

      

    功能块是功能   类固醇。功能是严格的   功能比功能更强大   额外的力量解决了一些(不是全部)的   通常面临的挑战   你使用函数指针。

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

    答案 2 :(得分:1)

    尝试阅读有关Functors的更多信息重载Function运算符()的类称为Functor。有关STL解释的任何体面的C ++书都会有关于它的信息 Here是您可以参考的链接。

    答案 3 :(得分:0)

    我想指出在C ++ 11之后,你可以避免使用lambda这样的东西:

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