如何通过引用传递成员回调函数

How to pass a member callback function by reference

本文关键字:成员 回调 函数 何通过 引用      更新时间:2023-10-16

我正在尝试实现一种方法来处理C++中的HTTP请求,但是我遇到了一些微不足道的问题。我试图将这些函数封装到两个不同的类中,当我不知道当回调函数作为非静态成员函数实现时,我应该如何通过引用传递回调函数,有什么建议吗?

谢谢!

以下是我的一些实现:

// my_lib.hpp
#include <functional>
class my_lib {
public:
    // A library to handle the HTTP requests
    using request_callback = std::function<void(int response_code, const std::string &data)>;
    void perform_request(std::string &url, std::string &body, const request_callback &callback);
};
// my_lib.cpp
#include "my_lib.hpp"
#include <string>
void my_lib::perform_request(std::string &url, std::string &body, const request_callback &callback) {
    
    // Do http request...
    std::string str("...");
    callback(200, str);
}
// myClass.hpp
#include <string>
#include <functional>
#include "my_lib.hpp"
class myClass {
public:
    using request_callback = std::function<void(int response_code, const std::string &data)>;
    void on_action_callback(int response_code, const std::string &data);
    void on_action_endpoint(const std::string &request, const request_callback &callback);
private:
    my_lib* lib_instance;
};
// myClass.cpp
#include "myClass.hpp"
void myClass::on_action_callback(int response_code, const std::string &data) {
    // do something
}
void myClass::on_action_endpoint(const std::string &request, const request_callback &callback) {
    int code = 0;
    
    // TODO: how should I pass the on_action_callback here....
    lib_instance->perform_request("a.com", "a", myClass::on_action_callback);
}

只需包装成一个 lambda:

lib_instance->perform_request("a.com", "a", 
    [this](int response_code, const std::string &data) 
    { on_action_callback(response_code, data); });

这里应该捕获this以便能够调用成员函数。另一种选择是使用从成员函数构造的std::function进行bind this,但这里并不真正需要这种复杂性