2017-10-20 115 views
0

我想实现一个方法来处理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); 
 
}

+0

总是有'std :: function'。 –

回答

0

只是包装为lambda:

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

这里this应该捕获到能够调用成员函数。另一种选择是bindthis与从您的成员函数构造的std::function,但您并不真的需要这种复杂性在这里

相关问题