std::functionとstd::bind詳細

3149 ワード

std::function
std::functionはヘッダファイルincludeに含まれ、各種呼び出し可能なエンティティをカプセル化して統一することができる.
  • 一般関数
  • lambda式
  • 関数ポインタ
  • シミュレーション関数(functorリロードカッコ演算子実装)
  • クラスメンバー関数
  • 静的メンバー関数
  • 次の例では、上記のいくつかの方法で、2つの数のサイズを簡単に比較する機能を実現します.
    #include 
    #include 
    
    using namespace std;
    
    std::function fun;

    1.一般関数
    //    
    bool compare_com(int a, int b)
    {
        return a > b;
    }
    

    2.lambda式
    //lambda   
    auto compare_lambda = [](int a, int b){ return a > b;};
    

    3.擬似関数
    //   
    class compare_class
    {
    public:
        bool operator()(int a, int b)
        {
            return a > b;
        }   
    };

    4.クラスメンバー関数(動的、静的)
    //     
    class compare
    {
    public:
        bool compare_member(int a, int b)
        {
            return a > b;
        }
        static bool compare_static_member(int a, int b)
        {
            return a > b;
        }
    };

    対応するmain関数は次のとおりです.
    int main()
    {
        bool result;
        fun = compare_com;
        result = fun(10, 1);
        cout << "      , result is " << result << endl;
    
        fun = compare_lambda;
        result = fun(10, 1);
        cout << "lambda     , result is " << result << endl;
    
        fun = compare_class();
        result = fun(10, 1);
        cout << "     , result is " << result << endl;
    
        fun = compare::compare_static_member;
        result = fun(10, 1);
        cout << "         , result is " << result << endl;
    
                   ,    bind  ,         ,          
        compare temp;
        fun = std::bind(&compare::compare_member, temp, std::placeholders::_1, std::placeholders::_2);
        result = fun(10, 1);
        cout << "         , result is " << result << endl;

    次にstd::bind関数について説明します.
    std::bind関数は呼び出し可能オブジェクト(前述の6種類)と呼び出し可能オブジェクトのパラメータをバインドし、新しい呼び出し可能オブジェクト(std::functionタイプ、パラメータリストが変更可能)を返し、返される新しいstd::function呼び出し可能オブジェクトのパラメータリストはbind関数実パラメータのstd::placeholders:::x小さいから大きいまで対応するパラメータを決定する.次に、シミュレーション関数バインドを例に、入力数が3未満かどうかを比較します.
    //bind  
        std::function fun2;
        //                 int,std::placeholders::_1  compare_class()     
        fun2 = std::bind(compare_class(), 3, std::placeholders::_1);
        result = fun2(3);
        cout << "bind    , result is " << result << endl;
        return 0;
    }

    ここで、返される新しいstd::function呼び出し可能なオブジェクトのパラメータリストがどのように決定されるかを詳細に説明します.
    #include 
    #include 
    
    using namespace std;
    struct Int 
    {
        int a;
    };
    
    bool compare_com(struct Int a, float b)
    {
        return a.a > b;
    }
    
    int main()
    {
        Int a = {1};
        //placeholders::_1  float, placeholders::_2  struct Int     fun    function
        std::function fun = bind(compare_com, placeholders::_2, placeholders::_1);
        bool result = fun(2.0, a);
        cout << "result is " << result << endl;
        return 0;
    }