2

Je n'arrive pas à déclarer un pointeur générique à fonction.C++ pointeur générique vers (membre?) Fonction

Avoir ces 2 fonctions à appeler:

void myfunc1(std::string str) 
{ 
    std::cout << str << std::endl; 
} 
struct X 
{ 
     void f(std::string str){ std::cout<< str << std::endl;} 
}; 

et ces appelants deux fonctions:

typedef void (*userhandler_t) (std::string); 
struct example 
{ 
    userhandler_t userhandler_; 

    example(userhandler_t userhandler): userhandler_(userhandler){} 

    void call(std::string str) 
    { 
     userhandler_(str); 
    } 
}; 
template<typename func_t> 
void justfunc(func_t func) 
{ 
    func("hello, works!"); 
} 

lorsque je tente de les utiliser avec boost :: bind pour appeler la fonction de membre qu'ils donnent moi compiler les erreurs.

cela fonctionne:

example e1(&myfunc1); 
e1.call("hello, world!"); 
justfunc(&myfunc1); 

cela ne:

X x; 
example e2(boost::bind(&X::f, &x, _1)); 
e2.call("hello, world2!"); 
justfunc(boost::bind(&X::f, &x, _1)); 

Comment cela est censé être fait?

+0

Ni le type de retour, ni le type d'argument de 'X :: f' correspond à ce que' example' exige. Qu'espériez-vous arriver? –

Répondre

7

boost::bind crée des objets qui se comportent comme des fonctions et non comme des pointeurs de fonction réels. Utilisez la bibliothèque Boost.Function pour tenir le résultat de l'appel boost::bind:

struct example 
{ 
    boost::function<void(std::string)> userhandler_; 
    ... 
}; 
+0

Comme l'a dit Marcelo, 'boost :: bind' crée __ les objets de fonction__ (alias _functors_), et non _function pointers_. +1 de moi. – sbi

+0

Thx, j'ai manqué cela dans les docs (était ici: http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html#with_boost_function) –

Questions connexes