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::bindWindow类的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;
}
posted @ 2024-12-15 20:27  White_ink  阅读(96)  评论(0)    收藏  举报