Prioritäten setzten
-
Hallo,
der Compiler sucht sich immer die am besten passende Funktion heraus. Aber warum bevorzugt der Compiler bitte eine alles akzeptierende Templatefunktion vor einer Funktion, die den Basisklasse des Parameters annimmt?
struct Base { }; struct Derived : public Base { }; void func(Base) { std::cout << "Base" << std::endl; } template <typename T> void func(T) { std::cout << "Template" << std::endl; } int main() { Derived d; func(d); return 0; }Folge: Es wird immer "Template" ausgegeben.
Gibt es da einen Workaround?Danke
-
OberstePriorität schrieb:
der Compiler sucht sich immer die am besten passende Funktion heraus. Aber warum bevorzugt der Compiler bitte eine alles akzeptierende Templatefunktion vor einer Funktion, die den Basisklasse des Parameters annimmt?
Weil ganz einfach für die Templatefunktion keine impliziten Konvertierungen (z.B. die in die Basisklasse) nötig sind.
Gibt es da einen Workaround?
Diverse. Du kannst explizit die Konvertierung in Base vornehmen. Du kannst im Template selbst eine Verzweigung einbauen, die, falls das Argument von Base abgeleitet ist, func(Base) aufruft. Du kannst mit SFINAE das Template für von Base abgeleitete Typen unbenutzbar machen (std::enable_if, std::is_base_of, bzw. die selben in boost)
-
Okay, da musste mich erstmal ein wenig reindenken, aber es funktioniert astrein, danke
![:] 🙂](https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso)
-
OberstePriorität schrieb:
Okay, da musste mich erstmal ein wenig reindenken
Das kann dir keiner abnehmen

-
Was spricht gegen Template-Spezialisierung?
-
ich glaube eher ihm ging es um die vererbungsbeziehung...
und genau dafür braucht er mindestens ne referenz oder nen pointer
-
Skym0sh0 schrieb:
ich glaube eher ihm ging es um die vererbungsbeziehung...
und genau dafür braucht er mindestens ne referenz oder nen pointer
Eben nicht, wenn man es so macht, wie es pumuckl gesagt hat.
-
easy?! schrieb:
Was spricht gegen Template-Spezialisierung?
Dass es ein Funktionstemplate ist und man die grundsätzlich eher überladen als spezialisieren sollte.
-
pumuckl schrieb:
easy?! schrieb:
Was spricht gegen Template-Spezialisierung?
Dass es ein Funktionstemplate ist und man die grundsätzlich eher überladen als spezialisieren sollte.
Wieso? Was wären die Folgen von Funktionstemplates?
-