std::bind回调函数
std::bind回调函数
#include<functional>
作用
将一个可调用对象(如函数、函数指针、成员函数指针或者函数对象)和一些参数绑定起来,生成一个新的可调用对象
(1)对函数的参数进行预先绑定,改变函数的参数个数和顺序,方便在不同的场景下调用
(2)用于将成员函数绑定为回调函数
示例
int add(int a, int b) {
return a + b;
}
#include <iostream>
#include <functional>
int main() {
auto addOne = std::bind(add, 1, std::placeholders::_1);
int result = addOne(2);
std::cout << "The result is: " << result << std::endl;
return 0;
}
//调用addOne(2)->调用add(1, 2)
应用示例
把类的成员函数灵活地设置为回调函数
按钮点击事件与窗口关闭操作
图形用户界面(GUI)编程中,当一个按钮被点击时,需要调用一个类的成员函数来处理这个事件
假设我们有一个Button类和一个Window类,Button类有一个onClick回调函数,当按钮被点击时会调用这个回调函数。Window类有一个成员函数closeWindow用于关闭窗口。
class Button {
public:
//定义名为 “Callback” 的类型别名,等同于 “std::function<void ()>”。
//“Callback” 现在可以用来表示一个可调用对象
using Callback = std::function<void()>;
//接受一个类型为 Callback 的参数 callback,通过初始化列表的方式->将传入的回调函数赋值给成员变量 m_callback->把按钮和具体的点击响应操作关联起来了
Button(Callback callback) : m_callback(callback) {}
//执行存储在m_callback中的可调用对象,执行预先绑定好的相应操作
void click() { m_callback(); }
private:
Callback m_callback;//存储当按钮被点击时要执行的回调操作
};
class Window {
public:
Window() {
//创建了一个Button类的实例closeButton
Button closeButton(std::bind(&Window::closeWindow, this));
//让closeButton这个按钮在被点击时(也就是调用closeButton.click()时),能够正确地调用当前Window对象的closeWindow成员函数,从而实现关闭这个窗口的逻辑:点击->关闭
}
void closeWindow() {
std::cout << "Window is closing." << std::endl;
}
};
std::bind将Window类的closeWindow成员函数绑定到Button类的m_callback成员变量上。this指针确保了在调用回调函数时能够正确地访问Window类的成员函数.
关于函数参数调整
可以改变函数的参数顺序或者固定某些参数,使得函数能够适应特定的调用场景。
格式化输出字符串:接受一个格式字符串和多个参数
void formatOutput(const char* format, int arg1, int arg2) {
printf(format, arg1, arg2);
}
int main() {
//利用bind固定字符串
auto printSum = std::bind(formatOutput, "The sum is: %d\n",
std::placeholders::_1, std::placeholders::_2);
printSum(2, 3);
return 0;
}

浙公网安备 33010602011771号