Pointeur de méthode surchargé C ++

Comment obtenir un pointeur de méthode sur une surcharge particulière d’une méthode:

struct A { void f(); void f(int); void g(); }; 

je le sais

 &A::g 

est un pointeur sur g . Mais comment puis-je obtenir un pointeur sur f ou f(int) ?

 (void (A::*)()) &A::f (void (A::*)(int)) &A::f 

les pointeurs de fonction et les pointeurs de membre ont cette fonctionnalité – la surcharge peut être résolue en fonction de l’affectation ou de la dissortingbution du résultat.

Si les fonctions sont statiques, vous devriez les traiter comme des fonctions ordinaires:

 (void (*)()) &A::f; (void (*)(int)) &A::f; 

ou même

 (void (*)()) A::f; (void (*)(int)) A::f; 

Il vous suffit de lancer le résultat de &A::f pour lever l’ambiguïté:

 static_cast(&A::f); // pointer to parameterless f static_cast(&A::f); // pointer to f which takes an int 

Merci à Stefan Pabst pour l’idée suivante, qu’il a présentée lors d’un exposé éclair de cinq minutes à l’ACCU 2015. Je l’ai étendue avec des types de balises pour permettre de résoudre les surcharges à l’aide de leur qualificatif cv et / ou de référence, ainsi que d’une variable C ++ 17. gabarit pour éviter de devoir taper la paire de parenthèses supplémentaire qui est par ailleurs requirejse.

Cette solution fonctionne sur le même principe que les réponses basées sur la dissortingbution, mais vous évitez de reformuler le type de retour de la fonction ou, dans le cas de fonctions membres, le nom de la classe dont la fonction est membre, comme le compilateur est capable de déduire ces choses.

 bool free_func(int, int) { return 42; } char free_func(int, float) { return true; } struct foo { void mem_func(int) {} void mem_func(int) const {} void mem_func(long double) const {} }; int main() { auto f1 = underload(free_func); auto f2 = underload(&foo::mem_func); auto f3 = underload(&foo::mem_func); auto f4 = underload(&foo::mem_func); } 

Le code implémentant le modèle de underload est ici .