2017-10-20 63 views
0

J'essaie d'implémenter une méthode pour traiter les requêtes HTTP en C++, mais j'ai rencontré des problèmes triviaux. J'ai essayé d'encapsuler les fonctions dans deux classes différentes, et quand je ne sais pas comment je devrais passer une fonction de rappel par référence quand la fonction de rappel est implémentée comme fonction de membre non statique, des suggestions?Comment passer une fonction de rappel de membre par référence

Merci!

Voici quelques-unes de mes réalisations:

// 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

Il ya toujours 'std :: function'. –

Répondre

0

envelopper juste dans un lambda:

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

ici this devraient être capturés pour être en mesure d'appeler la fonction de membre. Une autre option est bindthis avec un std::function construit à partir de votre fonction de membre, mais vous n'avez pas vraiment besoin de cette complexité ici