2011-03-31 65 views
10

我最近問了一個關於從向量中移除項目的問題。那麼,我得到的解決方案的工作,但我不明白 - 我找不到解釋它的任何文檔。C++運算符()括號重載

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的文檔,它說,它可以傳遞一個函數的類,而不是隻在類重載()運營商。沒有任何信息。

有誰知道鏈接:

    • 含書實例/解釋相關
      或者在線文檔的鏈接/教程

  • 幫助與此將不勝感激。除非我理解,否則我不喜歡將代碼添加到我的軟件中。我知道它的工作原理,並且我很熟悉(有點)操作符重載,但我不知道()操作符是什麼。

    回答

    11

    這就是所謂的C++

    算符此答案的一個很好的例子等

    C++ Functors - and their uses

    +0

    太謝謝你了!只要它讓我,我會接受你的答案(這是說我必須等待10分鐘) – FurryHead 2011-03-31 17:00:48

    1

    嘗試和了解更多關於Functors重載Function operator()的類稱爲Functor。任何有關STL解釋的正派C++書籍都會有關於它的信息。
    Here是您可能參考的鏈接。

    2

    這是一個functionoid,以及實際上是一個仿函數。但常見問題解釋了這一切:

    類固醇是 類固醇的功能。 Functionoids嚴格來說比功能強大 ,並且 額外的功率解決了一些(不是全部) 您使用函數指針時通常面臨的挑戰。

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

    +0

    這是我第一次聽到功能。我從我最喜歡的偏斜事實網站上看到。其他人是否有這個術語的確切參考?谷歌只會找到最終導致回遷的鏈接。或者,這只是另一個會導致混亂的女傭(因此它的使用早於後期就會被淘汰)。 – 2011-03-31 17:36:17

    +0

    +1用於引用FAQ並提供鏈接。 – 2011-03-31 20:01:21

    0

    我想指出的是,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());