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();
}
Merci pour l'aide. – shaz