Merci à Stefan Pabst pour l'idée suivante, wh Il l'a présenté lors d'une conférence de cinq minutes à ACCU 2015. Je l'ai étendu avec des types de balises pour permettre de résoudre les surcharges par leur qualificatif cv et/ou leur qualificatif de référence, et un template variable C++ 17 pour éviter d'avoir à taper de parenthèses qui est autrement nécessaire.
Cette solution fonctionne sur le même principe que les réponses cast, mais vous évitez d'avoir à redéfinir le type de retour de la fonction ou, dans le cas de fonctions membres, le nom de la classe dont la fonction est une membre de, 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<int, float>(free_func);
auto f2 = underload<long double>(&foo::mem_func);
auto f3 = underload<cv_none, int>(&foo::mem_func);
auto f4 = underload<cv_const, int>(&foo::mem_func);
}
Le code mise en œuvre du modèle underload
est here.
Merci! Que faire si les fonctions membres sont statiques? (Je reçois 'erreur: adresse de la fonction surchargée sans information de type contextuel') –
@Neil: Voir mon edit –
Oh, je vois, je viens de me débarrasser du premier' A :: 'pour les fonctions statiques, car ils peuvent être jeté aux pointeurs réguliers. Vous me battez aussi :) –