7

重複の可能性:
C++ ファンクター - およびその使用法。
operator() をオーバーライドする理由

STL コンテナーでの使用を見てきましたoperator()が、それは何で、いつ使用しますか?

4

2 に答える 2

10

その演算子は、オブジェクトをファンクターに変換します。これがどのように行われるかの良い例です。

次の例は、クラスをファンクターとして使用するように実装する方法を示しています。

#include <iostream>

struct Multiply
{
    double operator()( const double v1, const double v2 ) const
    {
        return v1 * v2;
    }
};

int main ()
{
    const double v1 = 3.3;
    const double v2 = 2.0;

    Multiply m;

    std::cout << v1 << " * " << v2 << " = "
              << m( v1, v2 )
              << std::endl;
}
于 2011-01-14T09:05:54.440 に答える
4

オブジェクトを関数のように「呼び出し可能」にします。ただし、関数とは異なり、オブジェクトは状態を保持できます。実際には、関数は静的ローカルを使用して弱い意味でこれを行うことができますが、その静的ローカルは、任意のスレッドによって任意のコンテキストで行われたその関数への呼び出しに対して永続的に存在します。

関数として機能するオブジェクトでは、状態はそのオブジェクトのみのメンバーであり、独自のメンバー変数のセットを持つ同じクラスの他のオブジェクトを持つことができます。

boost::bind (古い STL バインダーに基づいていた) の全体は、この概念に基づいています。

関数には固定の署名がありますが、多くの場合、アクションを実行するために署名で実際に渡されるよりも多くのパラメーターが必要です。

于 2011-01-14T09:18:57.863 に答える