std::function -> pointeur de fonction
Voici un code:
#include <functional>
using namespace std::tr1;
typedef void(*fp)(void);
void foo(void)
{
}
void f(fp)
{
}
int main()
{
function<void(void)> fun = foo;
f(fun); //error
f(foo); //ok
}
À l'origine, j'ai besoin de faire un pointeur de fonction à partir de la non-statique méthode de la classe parce que j'ai besoin d'enregistrer des données entre les appels de fonction. J'ai essayé std::tr1::bind
et boost::bind
, mais ils reviennent objet fonctionnel, pas de pointeur, qui, comme je peux le voir, ne peut pas être "coulé" pur fonctionnelle pointeur. Alors que la signature de la fonction (SetupIterateCabinet
) exige une pure func pointeur exactement.
- Je besoin d'un conseiller sur la façon de résoudre le problème. Merci.
OriginalL'auteur fogbit | 2012-05-11
Vous devez vous connecter pour publier un commentaire.
Vous avez trop simplifiée de votre réel problème et l'a transformé votre question dans un XY problème. Revenons à votre réel question: comment appeler
SetupIterateCabinet
avec un non-membre statique de la fonction de rappel.Donné un peu de classe:
Afin d'utiliser
MyClass::MyCallback
comme troisième argument deSetupIterateCabinet
, vous avez besoin pour passer unMyClass*
pour laContext
argument et utilisez un simple cale pour prendre queContext
argument et faire la bonne chose avec elle:OriginalL'auteur ildjarn
Vous ne pouvez pas convertir un
std::function
à un pointeur de fonction(vous pouvez faire le contraire). Vous devez utiliser des pointeurs de fonction, oustd::function
s. Si vous pouvez utiliserstd::function
au lieu de pointeurs, alors vous devriez.Cela rend votre code de travail:
Comment vous proposez-il changer
SetupIterateCabinet
(API C) de prendre un objet C++?devrait utiliser des pointeurs de fonction, ou
std::function
". Si il ne peut pas utiliserstd::function
alors il faut utiliser des pointeurs de fonction, sauf si il veut mettre sonstd::function
s autour des fonctions statiques, mais cela ne va pas être joli.vous ne pouvez pas et il n'a pas d'état de rien d'autre. Dans ces cas, j'ai habituellement un wrapper de la plaine de la fonction C qui, à l'aide du contexte de l'utilisateur" transmet le plus souvent à des rappels (SetupIterateCabinet offre une) pour acheminer le rappel pour certains C++ chose.
Donc, il n'y a pas de moyen de passer de l'objet d'état d'être?
OriginalL'auteur mfontanini