Diese Frage läuft darauf hinaus, zu bestimmen, wann die Spezialisierung verwendet werden soll, die die Überlastung nicht kann. Es gibt verschiedene Situationen, in denen dies der Fall ist, obwohl sie selten genug sind und es einfach genug ist, Fehler zu machen, dass die allgemeine Empfehlung darin besteht, Überlastungen Spezialisierungen vorzuziehen.
-
Wenn der Aufrufer explizit die Verwendung einer Vorlage anfordert. Im von Ihnen bereitgestellten Codebeispiel wird die Überlastung nicht verwendet, wenn der Aufruf f(42)
oder sogar f<42>()
lautet.
-
Wenn Sie die erforderlichen Überlastungen nicht bereitstellen können oder die Überlastung an der Stelle des Aufrufs nicht aufgelöst werden kann. Zum Beispiel, wenn der Typ nicht einer der Funktionsargumente ist (entweder gar nicht in der Signatur vorhanden ist oder nur im Rückgabetyp:
template T f();
In diesem Fall können Sie die Überladungen int f();
und double f();
nicht bereitstellen, aber Sie können so viele Vorlagenspezialisierungen bereitstellen, wie Sie benötigen, und es liegt am Benutzer, die Auswahl von einer oder der anderen zu erzwingen. Beachten Sie, dass dies als ein Unterfall des vorherigen Falls betrachtet werden könnte: Da die Vorlagensargumente keinen Teil der Funktionsargumente bilden, muss der Benutzer die Vorlagensargumente bereitstellen, damit der Aufruf explizit einer Vorlage zuzuordnen ist.
-
Wenn Sie spezielle Einschränkungen für die Kombination der Argumente festlegen und implizite Konvertierungen unterbinden möchten:
template void f( T, T ); // Beide Argumente müssen denselben Typ sein
Weil die Vorlagennargumentdeduktion nur perfekte Übereinstimmungen durchführt, kann diese Vorlage nur verwendet werden, wenn beide Argumente genau vom gleichen Typ sind. Wenn Sie eine Überladung hinzufügen void f(int,int)
, kann diese Überladung mit jeder Kombination von Typen verwendet werden, die implizit in int konvertierbar sind, wie f( 5, 3.0 )
, aber die Spezialisierung wird nicht verwendet.
Im Allgemeinen treffen in den meisten Fällen keiner der oben genannten Fälle wirklich zu, daher sollte eine Überladung bevorzugt werden.
Es gibt möglicherweise noch mehr, aber das sind diejenigen, an die ich mich spontan erinnern kann