std::function
简单而言就是一个函数包装器,一个通用函数类型
头文件 #include <functional>
用法:function<int(int, int)>
里面传入的是返回值 和参数列表
示例
#include <iostream>
#include <functional>
using namespace std;
void vfun() {
cout << "void fun()" << endl;
}
int ifun(int a) {
cout << "int fun(int a)" << endl;
return 0;
}
int main() {
// Your code here
function<void()> _vf = vfun; // 接收函数指针
function<int(int)> _if = ifun;
function<int()> _lf = []() {
cout << "lambda fun()" << endl;
return 1;
}; //接收 lambda 表达式
_vf(); // void fun()
_if(1); // int fun(int a)
_lf(); // lambda fun()
return 0;
}
std::bind
头文件#include <functional>
定义
先来看一下定义,这是在 cppreference 中对它的描述
The function template std::bind generates a forwarding call wrapper for
f
. Calling this wrapper is equivalent to invoking f with some of its arguments bound toargs
.函数模板 std::bind 为f生成一个转发调用包装器。调用这个包装器相当于调用f,它的一些参数绑定到args。
它的模板形式是这么定义的template< class F, class... Args >
用法
接下来我们来看看用法
调用bind的一般形式auto newCallable = bind(callable, arg_list);
绑定普通函数
假如我们现在有这样一个函数
void fun(int x, int y, int z) {
std::cout << "print: x = " << x << ", y = " << y << ", z = " << z << std::endl;
}
然后我们可以使用 std::bind
进行一个绑定
auto f1 = std::bind(fun, 1, 2, 3);
f1();
我们通过bind将 1, 2, 3 绑定到了 fun 的三个参数上,接下来使用f1(); 就相当于 调用了 fun(1, 2, 3);
再看一种情况
auto f2 = std::bind(fun, 1, std::placeholders::_1, std::placeholders::_2);
f2(2, 3);
这样表示我们表示绑定函数 fun 的第以个参数为1, 剩下两个由我们调用 f2 时的第一个和第二个参数决定
绑定类成员函数
因为类成员函数有一个隐含的参数 -> this
指针, 所以我们在绑定类成员函数时要先绑定 一个对象地址进去
示例
有这样一个类成员函数
struct Demo{
void fun(int x, int y, int z) {
std::cout << "print: x = " << x << ", y = " << y << ", z = " << z << std::endl;
}
};
应该这样绑定
Demo a;
auto f3 = std::bind(&Demo::fun, &a /*绑定 this 指针进去*/, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
f3(1, 2, 3);
注意,上面我都是用auto 接收的 bind 返回值,实际上可以用 function 接收