16

最近、ベクターからアイテムを削除することについて質問しました。ええと、私が得た解決策は機能しますが、私はそれを理解していません-そしてそれを説明するドキュメントを見つけることができません。

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

    4 に答える 4

    14

    C++ではファンクターと呼ばれます

    この答えには良い例などがあります

    C++ファンクター-およびその使用法

    于 2011-03-31T16:58:41.447 に答える
    3

    これは関数型であり、実際にはファンクターです。しかし、FAQはそれをすべて説明しています:

    Functionoidsはステロイドの機能です。関数型は関数よりも厳密に強力であり、その余分な能力は、関数ポインターを使用するときに通常直面する課題の一部(すべてではない)を解決します。

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

    于 2011-03-31T16:59:33.327 に答える
    1

    Functors関数operator()をオーバーロードするクラスは、ファンクターと呼ばれます。STLについての説明が書かれたまともなC++の本には、それに関する情報があります。
    ここにあなたが参照するかもしれないリンクがあります。

    于 2011-03-31T16:58:17.353 に答える
    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());
    
    于 2016-06-22T16:28:53.767 に答える