#include <iostream>
#include <functional>
//std::bind返回函数对象
void fun1(int a, int b)
{
std::cout << a << b << std::endl;
}
using namespace std::placeholders;
class A
{
public:
void fun2(int a, int b)
{
std::cout << a << b << std::endl;
}
};
int main()
{
//第一种用法,直接绑定实参
std::bind(fun1, 1, 2)();//调用时把1,2的拷贝作为实参传递给fun1,bind中绑定的参数必须与fun1调用的参数个数相同,参数将会传递给fun1作为入参
//占位符_1的用法,在函数调用时才接受正真的参数
std::bind(fun1, _2, _1)(1, 2);//占位符的名字表示在调用式中顺序,这个表示fun1(2, 1)
//绑定成员函数
A a;
std::bind(&A::fun2, a, _1, _2)(3, 4);//需要传递类似this指针的东西让这个函数对象调用&必须加
//functon用法,这个最多的用法可以存储bind返回的结果,在以后再需要的时候回调,是一种回调机制
std::function<void(int, int)> func;//function可以存储函数指针对象,之前以为只能存储std::bind
func = fun1;
func(5, 6);
//function调用成员函数
//1.在function中写类名称
std::function<void(A&, int, int)> fun1;//可以赋值int,int返回为void的成员函数
fun1 = std::bind(&A::fun2, _1, _2, _3);
fun1(a, 8, 9);
//2.在bind里面写类实例,这种方式比较多
std::function<void(int, int)>fun2;
fun2 = std::bind(&A::fun2, a, _1, _2);
fun2(9, 10);
getchar();
return 0;
}