首页 C++系列10:std::function与std::bind
文章
取消

C++系列10:std::function与std::bind

bind

1
2
3
4
5
6
7
8
9
10
11
绑定函数参数到一个函数对象上(参数可以使用占位符),并返回一个函数对象

using namespace std::placeholders;    //为了能使用 _1, _2, _3 进行占位,表示这个参数以调用时传入的参数为准

bind (Fn&& fn, Args&&... args); //参数fn也是一个函数对象

还可以指定执行结果的返回类型: std::bind<int> (my_divide,_1,_2);

std::bind(&callback);
std::bind(&aClass::callback, this);//绑定成员函数时第2个参数为对象地址
std::bind(&aClass::callback, this info);

function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::function<返回值(参数)>

可以使用lambda赋值,

另外std::bind绑定后的结果可以使用std::function保存,但需要注意参数类型:
void print_num(int i)
{
    std::cout << i << '\n';
}
std::function<void()> f_display_31337 = std::bind(print_num, 31337);
f_display_31337(); //原来是有int参数的,经过bind后,不需要参数了。

为了方便使用,常用以下形式
using target = std::function<bool(QObject* obj)>;
然后可以用target声明变量
target m_target = nullptr;
m_target = std:bind(xxx);

使用

1
2
3
4
auto lambdaSendMessage = [this](int id)
{
}
connect(hotkey2, &QHotkey::activated, std::bind(lambdaSendMessage, 2)); //connect的第三个参数是一个函数对象,可以用bind返回一个函数对象。

参考

https://www.cplusplus.com/reference/functional/bind/

https://en.cppreference.com/w/cpp/utility/functional/function

https://blog.csdn.net/wangshubo1989/article/details/49134235

欢迎评论交流

本文由作者按照 CC BY 4.0 进行授权