目录
std::function
std::function是可调用对象,是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。可以用统一的方式处理函数、函数对象、函数指针。
可调用对象:
1)是一个函数指针。
2)是一个具有operator()成员函数的类对象(仿函数)。
3)是一个可被转换为函数指针的类对象。
4)是一个类成员(函数)指针。
//头文件
#include<functional>
void func(void)
{
cout<<"func";
}
class Foo
{
public:
static int foo_func(int a)
{
return a;
}
};
class Foo1
{
public:
int operaror()(int a)
{
return a;
}
};
//绑定一个普通函数
std::function<void(void)> f = func;
f();
//绑定类的静态成员函数
std::function<int(int)> f1 = Foo::foo_func;
f1(11);
Foo1 foo1;
f1 = foo1; //绑定仿函数
f1(11);
std::function作为回调函数
class A { std::function<void()> callback_; public: A( const std::function<void()>& f):callback_(f) { } void notify(void) { callback_(); //回调到上层 } }; class B { public: void operator()(void) { cout<<"123"<<endl; } }; B b; A a(b); a.notify();
bind绑定器
std::bind用来将可调用对象(std::function)与其参数一起进行绑定。绑定后的结果可以使用std::function进行保存,并延迟调用到任何我们需要的时候。
主要有两大作用:
1)将可调用对象与其参数一起绑定成一个仿函数。
2)将多元(参数个数为n,n>1)可调用对象转成一元或者(n-1)元可调用对象,即只绑定部分参数。
void call_even(int x, const std::function<void(int)>& f) { if(!(x & 1)) // x % 2 == 0 { f(x); } } void output(int x) { cout<< x <<endl; } auto f = std::bind(output, std::placeholders::_1); for(int i = 0; i < 10; ++i) { call_even(i, f); } //std::placeholders::_1占位符,这个位置将在函数调用时,被传入的第一个参数所替代 //std::bind的返回值类型是一个stl内部定义的仿函数类型
两者结合使用:
class A { public: int i = 0; void output(int x, int y) { cout<< "x:" << x << "y:" << y <<endl; } }; //f的类型是std::function<void(int,int)>。通过使用std::bind,将A的成员函数output的指针和a绑定,并转换为一个仿函数放入f中存储。 A a; std::function<void(int, int)> f = std::bind(&A::output, &a, std::placeholders::_1, std::placeholders::_2); f(1, 2); // 1, 2 //std::bind将A的成员i的指针和a绑定,返回的结果被放入std:function<int&(void)>中存储,并可以在需要时修改访问这个成员。 A a; std::function<int& (void)> f1 = std::bind(&A::i, &a); f1() = 10; cout<< a.i << endl; //10