2011-01-14 8 views
4

重複の可能性:
C++ Functors - and their uses.
Why override operator() ?関数呼び出し演算子

私は、STLコンテナにoperator()の使用を見てきましたが、それは何であり、あなたはそれを使用ないとき?

+0

ありがとう、それはそれをカバーします。 – george

+1

@Troubadour:おそらく、operator()の使い方がわからない人は、何がファンクタなのか分かりにくく、その質問を探すことはできません。 – Gorpik

+0

@Gorpik:はい、しかし、私は最も基本的な検索でさえ、演算子()とファンクタの関係を明らかにすると思います。 – Troubadour

答えて

6

この演算子は、オブジェクトをファンクタに変えます。 Here is nice example of how it is done.

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

#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; 
} 
+0

これは、良い例に複雑な例を超えている。あなたが良い例をあなたの答えに加えるなら、それをリンクするのではなく+1してください。 –

+0

@Martin十分上手ですか?同じものを関数を使ってアーカイブすることもできます。 –

3

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

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

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

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