2010-05-25 13 views
3
#include <boost/bind.hpp> 
#include <iostream> 

using namespace std; 
using boost::bind; 

class A { 
public: 
    void print(string &s) { 
     cout << s.c_str() << endl; 
    } 
}; 


typedef void (*callback)(); 

class B { 
public: 
    void set_callback(callback cb) { 
     m_cb = cb; 
    } 

    void do_callback() { 
     m_cb(); 
    } 

private: 
    callback m_cb; 
}; 

void main() { 
    A a; 
    B b; 
    string s("message"); 
    b.set_callback(bind(A::print, &a, s)); 
    b.do_callback(); 

} 

Donc ce que j'essaie de faire est d'avoir la méthode d'impression d'un flux "message" à cout lorsque le rappel de b est activé. Je reçois un nombre inattendu d'erreurs d'arguments de msvc10. Je suis sûr que c'est super basique et je suis désolé d'avance.Noob boost :: bind membre fonction callback question

Répondre

9

avec typedef void (*callback)(); remplacer typedef boost::function<void()> callback;

Une fonction liée ne produit pas une fonction ordinaire, donc vous ne pouvez pas simplement stocker dans un pointeur de fonction régulière. Cependant, boost::function est capable de gérer n'importe quoi tant qu'il est appelable avec la bonne signature, c'est ce que vous voulez. Cela fonctionnera avec un pointeur de fonction, ou un foncteur créé avec bind.

Après quelques corrections à votre code, je suis venu avec ceci:

#include <boost/bind.hpp> 
#include <boost/function.hpp> 
#include <iostream> 

// i prefer explicit namespaces, but that's a matter of preference 

class A { 
public: 
    // prefer const refs to regular refs unless you need to modify the argument! 
    void print(const std::string &s) { 
     // no need for .c_str() here, cout knows how to output a std::string just fine :-) 
     std::cout << s << std::endl; 
    } 
}; 


// holds any arity 0 callable "thing" which returns void 
typedef boost::function<void()> callback; 

class B { 
public: 
    void set_callback(callback cb) { 
     m_cb = cb; 
    } 

    void do_callback() { 
     m_cb(); 
    } 

private: 
    callback m_cb; 
}; 

void regular_function() { 
    std::cout << "regular!" << std::endl; 
} 

// the return type for main is int, never anything else 
// however, in c++, you may omit the "return 0;" from main (and only main) 
// which will have the same effect as if you had a "return 0;" as the last line 
// of main 
int main() { 
    A a; 
    B b; 
    std::string s("message"); 

    // you forget the "&" here before A::print! 
    b.set_callback(boost::bind(&A::print, &a, s)); 
    b.do_callback(); 

    // this will work for regular function pointers too, yay! 
    b.set_callback(regular_function); 
    b.do_callback(); 

} 
+0

Merci pour l'aide. – shaz