Ich habe festgestellt, dass es eine Asymmetrie zwischen der Signatur gibt, die zur Unterscheidung eindeutiger Vorlagenfunktionen verwendet wird, und der Signatur, die zur Unterscheidung eindeutiger Funktionen verwendet wird (einschließlich derjenigen, die aus Vorlagenfunktionen instanziiert werden).Wie können Funktionsschablonen, die sich nur durch den Rückgabetyp unterscheiden, disambiguiert werden?
Insbesondere Template-Funktionen, die sich nur durch den Rückgabetyp unterscheiden, werden als eindeutig betrachtet, während Funktionen, die sich nur durch den Rückgabetyp unterscheiden, als redundant betrachtet werden.
Daher habe ich eine entsprechende Frage, wie zwischen Funktionsschablonen, die nur von Rückgabetyp unterscheiden, an dem Punkt der Instanziierung eindeutig zu machen:
#include <iostream>
template<typename T>
long foo(T)
{
std::cout << "long" << std::endl;
return 0;
}
template<typename T>
char foo(T)
{
std::cout << "char" << std::endl;
return '\0';
}
int main()
{
double d = 0.0;
long n = foo(d); // <- Ambiguous: How to specify the template function to use?
}
In dem obigen Code, die Instanziierung der Schablonenfunktion foo
ist mehrdeutig gerade wegen der Asymmetrie, die ich gerade erwähnt habe. Das Vorhandensein der beiden Vorlagenfunktionsdefinitionen ist zulässig, die Instanziierung ist jedoch unzulässig, obwohl der Rückgabetyp in derselben Codezeile angegeben ist.
Ich stelle diese Frage rein für theoretische Lernzwecke. Vielleicht wäre dieses Code-Konstrukt im wirklichen Leben ein Zeichen für schlechtes Design. Vielleicht würde es im wirklichen Leben nie entstehen. Ich kann mir auch verschiedene Möglichkeiten vorstellen, dieses Problem zu lösen, indem ich die Template-Definitionen ändere (oder andere Änderungen vornahm).
Dennoch würde ich gerne wissen, ob, unter Beibehaltung der Template-Definitionen, es möglich ist, zwischen diesen beiden Template-Funktionen zum Zeitpunkt der Instanziierung zu disambiguieren.
+1 Hab 'nie darüber nachgedacht. Hässlich aber korrekt. BTW, 'static_cast (foo) (d)' reduziert 1 Zeichen :) –
iammilind
Perfekt. Jetzt ist mein Vertrauen in Funktionsvorlagen wiederhergestellt. Ich fing an, mich zu wundern, warum Funktionsschablonensignaturen Rückgabetyp enthalten - wenn sie nicht immer eindeutig sein können. Aber, wie Ihre ausgezeichnete Antwort zeigt, können sie. –