C ++のSTL関数オブジェクト

過負荷もファンクタ(ファンクタ)と呼ばれることが多いオブジェクト関数オブジェクト(関数オブジェクト)と呼ばれるクラスの関数呼び出し演算子、すなわち、それらは目的関数の挙動と類似しているが、実際に過負荷である「()」演算子、その結果可能な限り、関数呼び出しのようなクラスのオブジェクト。
注:関数オブジェクト(ファンクタ)クラス、関数ではなく。それは関数のように呼び出すことができるように、2機能オブジェクト(ファンクタ)は、「()」演算子をオーバーライドします。
(逆に、もしオーバーロードされた演算子、必要なパラメータを取得します)クラスは、オーバーロード演算子()、および、オーバーロード演算子を(持っていると仮定し、我々は、このクラス「シングル数子」(単項ファンクタ)を呼び出します)2つのパラメータを必要とするクラスは、「バイナリファンクタ」(バイナリファンクタ)と呼ぶことにします。

書式#include <iostreamの> 
の#include <ベクトル> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、

クラスFuncObject01 
{ 
パブリック無効 演算子()()
    { 
        coutの << " Hello Worldの!" << てendl; 
    } 
}。

FuncObject02()
{ 
    coutの << " Hello Worldの!" << てendl; 
} 

ボイドTEST01()
{ 
    FuncObject01 fobj。
    fobj();
    FuncObject02(); 
    COUT << " ----------------------- " << ENDL; 
} 

クラスFuncObject03 
{ 
パブリックint型の 演算子()(int型 A、int型B)
    { 
        戻り A + B; 
    } 
} ; 

INT FuncObject04(INT A、int型B)
{ 
    戻り A + B; 
} 

// 関数オブジェクトは、通常の関数と同じであってもよいが、戻り値とパラメータ有する
ボイドTEST02()
{ 
    ; FuncObject03 F OBJ 
    INTを= F OBJ RET(  1020である); 
    COUT << " RET = " << RET << ENDL; 
    RET = FuncObject04(1030 ); 
    COUT << " RET = " << RET << ENDL; 
    COUT << " - -----------------------  << てendl; 
} 

// 関数の通常の機能を超えた関数オブジェクトは、関数呼び出しが状態を保存している可能性があり
 // 我々は、例えば、関数呼び出しの数をカウントする

クラスFuncObject05 
{ 
パブリック
    )FuncObject05(:カウント( 0 ){}
     演算子()()
    { 
        coutの << " Hello Worldの!" << てendl; 
        COUNT ++ ; 
    } 
    int型のCOUNT; 
}; 

// 共通の周波数の統計情報はグローバル変数必要とする関数を呼び出す
int型 g_count = 0を無効FuncObject06()
{ 
    COUT << " Hello Worldの!" << てendl; 
    g_count ++ ; 
} 

無効TEST03()
{ 
    FuncObject06(); 
    FuncObject06(); 
    COUT << " 機能の数が呼び出されます:" << g_count << てendl;
     //は、グローバル変数を使用せずに関数オブジェクトを使用し
    FuncObject05 F OBJ; 
    F OBJ(); 
    F OBJ(); 
    F OBJ(); 
    COUT << " 関数呼び出しの時間を:" < <fobj.count << てendl; 
    COUT << " --------------------------- " << てendl; 
} 

// 関数オブジェクトありませんパラメータと戻り値の
クラスの印刷
{ 
パブリック
    印刷():カウント( 0 ){}
     ボイド 演算子()(CONSTの INTヴァル)
    { 
        COUT <<ヴァル<< "  " 
        カウント ++ ; 
    } 
    int型のカウント。
}。

int型 NUM = 0 ;
無効 PRINT2(INT ヴァル)
{ 
    COUT <<ヴァルを<< "  " 
    NUM ++ ; 
} 

ボイドtest04()
{ 
    ベクトル < INT > V。
    v.push_back(1 )。
    v.push_back(3 )。
    v.push_back( 5 )。
    v.push_back(2 );
     //は、コンテナ要素を介しfor_eachアルゴリズム繰り返し
    、印刷myPrintを
     // 関数オブジェクトパラメータと値が行う返す 
    myPrint = for_each(v.begin()、v.end()、myPrint)を、
    COUT << ENDL ; 
    COUT << " 関数呼び出し回数:" << myprint.count << ENDL; 
    for_each(v.begin()、v.end()、PRINT2); 
    COUT << ENDL; 
    COUT << " 関数呼び出し回数:" NUM << << ENDL; 
} 

int型のmain()
{ 
    TEST01();
    test04();
    TEST02();
    TEST03(); 
    getchar関数(); 
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/duxie/p/10939600.html