C/C++ C++ 11 std::function和std::bind用法


std::bind()

       std::bind 主要用於綁定生成目標函數,一般用於生成的回調函數,cocos的回退函數都是通過std::bind和std::function實現的。兩個點要明白:

1.綁定全局或者靜態函數比綁定成員函數少了個成員變量,且不需要引用如下

    //綁定全局函數
    auto pfunc = std::bind(func1, 3);
    //綁定靜態函數
    pfunc = std::bind(Func::func6, 3);
    //綁定類成員函數,函數前需要添加引用,多一個變量參數fuc
    Func func;
    pfunc =std::bind(&Func::func2,func, 3);

  2.占位符std::placeholders::_1代表此處是要輸入參數,且這個參數排在第一位,代碼分析更明白

    #include <iostream>
    #include <functional>
    using namespace std;
    class Func
    {
    public:
        static void  func6(int numa, int numb, int numc)
        {
            std::cout << numa << " " << numb << " " << numc << endl;
        }
        void func2(int numa, int numb, int numc,std::string name)
        {
            std::cout << numa << " " << numb << " " << numc<<" " << name<< endl ;
        }
    }
    void callFunc(std::function<void(int a,int b)> call)
     {
         call(1,2);
     }
     void func1(int numa, int numb, int numc)
     {
         std::cout << numa << " " << numb << " " << numc << endl;
     }
    int main()
    {
       callFunc(std::bind(func1, std::placeholders::_1, std::placeholders::_2, 3));
       callFunc(std::bind(func1, std::placeholders::_2, std::placeholders::_1, 3));
       callFunc(std::bind(func1, std::placeholders::_2, 3, std::placeholders::_1));
       callFunc(std::bind(Func::func6, std::placeholders::_1, std::placeholders::_2, 3));
       callFunc(std::bind(&Func::func2, func, std::placeholders::_1, std::placeholders::_2, 3, "name"));
    }

運行結果如下      

 

 

 


 
std::function

        std::function等於函數指針,相比函數指針使用更方便,記錄一下幾種用法:指向全局或者靜態函數,類成員函數,Lambda表達式和仿函數。指向全局函數或者靜態函數時使用std::function<void()> testFunc = func3,指向類成員函數時,需要制定函數所屬的類的成員變量testFunc = std::bind(&Func::func2, func, 1, 2, 3, "name")。代碼如下:

    #include <iostream>  
    #include <string>
    #include <iostream>
    #include <functional>
    using namespace std;
    class Func
    {
    public:
        int sum;
        Func()
        {
            sum = 2;
        }
        void func2(int numa, int numb, int numc,std::string name)
        {
            std::cout << numa << " " << numb << " " << numc<<" " << name<< endl ;
        }
        void func4()
        {
            std::cout << "func4" << endl;
        }
        void operator() (int a,int b)
        {
            std::cout << "Operator:" << sum<<"  "<<a<<"  "<<b<<endl;
        }
        static void  func6(int numa, int numb, int numc)
        {
            std::cout << numa << " " << numb << " " << numc << endl;
        }
        static void  func5()
        {
            std::cout << "static func" << endl;
        }
    };
     void callFunc(std::function<void(int a,int b)> call)
     {
         call(1,2);
     }
     void func3()
     {
         std::cout <<"func3"<< endl;
     }
     void func1(int numa, int numb, int numc)
     {
         std::cout << numa << " " << numb << " " << numc << endl;
     }
    int main()
    {
        Func func;
        int sum = 10;
        int resultInt = 0;
        //全局或者靜態函數
        std::cout << "全局或者靜態函數" << endl;
        std::function<void()> testFunc = func3;
        testFunc();
        testFunc = Func::func5;
        testFunc();
        //類成員函數
        std::cout << "類成員函數" << endl;
        testFunc = std::bind(&Func::func2, func, 1, 2, 3, "name");
        testFunc();
        //Lambda表達式
        std::cout << "Lambda表達式" << endl;
        testFunc = [=, &resultInt](){std::cout << sum << endl; resultInt += 100; };
        testFunc();
        cout << "the reslutInt is " << resultInt << endl;
        //仿函數
        std::cout << "仿函數" << endl;
        std::function<void(int a, int b)> abFunc = func;
        abFunc(10, 20);
        std::cout << resultInt << std::endl;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM