2017-07-10 6 views
0

J'essaye d'écrire un module de bibliothèque qui appelle des opérations boost :: asio. Ce module serait utilisé par une couche logique d'application pour un traitement ultérieur, en fonction des résultats.boost :: bind comment définir une fonction qui prend un callback comme argument

Mon exigence est simple et simple. Tout ce dont j'ai besoin est de pouvoir spécifier un callback fn dans ma classe Util ci-dessous, qui peut prendre n'importe quelle fonction ptr, ou boost :: bind (member fn), ou autre, et invoquer ce callback, une fois le code async terminé .

class Util { 
    public: 
    void sendMsg(const Msg& m, <some callback fn here...>) { 
     // Make a call to boost::asio approximately as below.. 
     boost::asio::async_write(socket_, boost::asio::buffer(message_), 
        boost::bind(&tcp_connection::handle_write, shared_from_this(), 
        boost::asio::placeholders::error, 
        boost::asio::placeholders::bytes_transferred)); 

     // Here, I want to pass the "<some callback fn here>" to async_write, 
     // instead of calling boost::bind here. How to do that? 
    } 
}; 

Alors, ma question est .. À quoi devrait ressembler ma signature sendMsg comme? Je suis incapable d'arriver à la signature fn, en particulier la partie rappel.

Merci à tous ceux qui m'ont laissé savoir comment faire.

+0

'std :: function'? Ou un type de gabarit? – Arcinde

+0

okay. J'ai perdu le contact avec beaucoup de C++ ces jours-ci. Pourriez-vous fournir un exemple simple .. pls –

+1

ok, merci pour l'indice. Je semble l'avoir. Je suis une sorte de vieille école C++. Se familiariser avec boost, truc asynchrone. –

Répondre

0

Si vous avez accès à lambdas, il est facile

class Util { 
    public: 
    template <typename _Proc> 
    void sendMsg(const Msg& m, _Proc proc) 
    { 
     shared_ptr<Util> pThis = shared_from_this; 
     boost::asio::async_write(socket_, boost::asio::buffer(message_), 
      [&proc, =pThis/* , etra args */](boost::...::error_code ec, size_t bytes) // <- use capture to pass extra agruments and shared ptr 
      { 
       // use pThis ! 
       proc(/* etra args */); 
       // or pthis->proc() 
      }); 
     } 

}; 

Cela acceptera lambdas ainsi que :: fonction std/boost

+0

Merci. Mais Y shared_ptr pour la classe Util? L'appelant de Util :: sendMsg est supposé fournir un callback fn, que je dois passer à async_write. Non? –

+0

shared_ptr est transmis par valeur à l'objet appelant, soit par l'appel à bind(), soit par capture lambda. Il est uniquement destiné à garder l'objet en vie pendant qu'il y a des opérations d'E/S ou des temporisations en attente. 'ceci 'se détruira automatiquement lorsque la conversation avec le client sera terminée, à moins que vous ne la conserviez ailleurs. Généralement, un pointeur intelligent de message est transmis. –