Danke an Stefan Pabst für die folgende Idee, wh Ich stellte es in einem fünfminütigen Blitzvortrag auf der ACCU 2015 vor. Ich erweiterte es mit Tag-Typen, um Überladungen mit ihrem cv-Qualifier und/oder Referenz-Qualifier zu lösen, und einer C++ 17-Variablenvorlage, um das zusätzliche Paar nicht eingeben zu müssen von Klammern, die sonst benötigt werden.
Diese Lösung funktioniert nach dem gleichen Prinzip wie die Antworten auf Cast-Basis. Sie vermeiden jedoch, dass Sie entweder den Rückgabetyp der Funktion oder im Falle von Memberfunktionen den Namen der Klasse, für die die Funktion steht, neu angeben müssen Mitglied von, da der Compiler in der Lage ist, diese Dinge abzuleiten.
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);
}
Der Code der underload
Vorlage Implementierung ist here.
Danke! Was ist, wenn die Elementfunktionen statisch sind? (Ich erhalte 'Fehler: Adresse der überladenen Funktion mit keiner kontextuellen Typeninformation') –
@Neil: Sehen Sie meinen redigieren –
Oh, ich sehe, ich werde gerade das erste' A :: 'für statische Funktionen los, da sie können zu regulären Zeigern umgewandelt werden. Sie schlagen mich dazu :) –