Sur la page d'accueil de Bjarne Stroustrup (C++11 FAQ) :
struct X { int foo(int); };
std::function f;
f = &X::foo; //pointeur vers membre
X x;
int v = f(&x, 5); //appel de X::foo() pour x avec 5
Comment ça fonctionne ? Comment std::function appelle une fonction membre foo ?
Le paramètre du modèle est int(X*, int)
, &X::foo
est-il converti du pointeur vers fonction membre en un pointeur vers fonction non-membre ?!
(int(*)(X*, int))&X::foo //cast (int(X::*)(int) en (int(*)(X*, int))
Pour clarifier : Je sais que nous n'avons pas besoin de caster de pointeur pour utiliser std::function, mais je ne comprends pas comment std::function gère cette incompatibilité entre un pointeur vers fonction membre et un pointeur vers fonction non-membre au niveau interne. Je ne sais pas comment la norme nous permet d'implémenter quelque chose comme std::function !
1 votes
Si vous faites référence à une autre page web. Veuillez toujours fournir le lien.
1 votes
La page est ici : www2.research.att.com/~bs/C++0xFAQ.html#std-function. Bjarne affirme que c'est légal, mais ne mentionne pas les mécanismes de fonctionnement (qu'il s'agisse de modèles astucieux ou d'une sorte de nouvelle conversion intégrée).