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;
}