Gute Antworten! Insbesondere die Antwort von A.Rex ist sehr detailliert und lehrreich. Wie er hervorhebt, ist C++ fait beim Kompilieren vom Benutzer bereitgestellte Typkonvertierungsoperatoren berücksichtigen lhs = func();
(wobei func in Wirklichkeit der Name einer Struktur ist) . Meine Lösung ist etwas anders - nicht besser, nur anders (obwohl sie auf der gleichen Grundidee beruht).
Ich hingegen hatte gesucht zu schreiben...
template <typename T> inline T func() { abort(); return T(); }
template <> inline int func()
{ <<special code for int>> }
template <> inline double func()
{ <<special code for double>> }
.. etc, then ..
int x = func(); // ambiguous!
int x = func<int>(); // *also* ambiguous!? you're just being difficult, g++!
Ich endete mit einer Lösung, die eine parametrisierte Struktur verwendet (mit T = der Rückgabetyp):
template <typename T>
struct func
{
operator T()
{ abort(); return T(); }
};
// explicit specializations for supported types
// (any code that includes this header can add more!)
template <> inline
func<int>::operator int()
{ <<special code for int>> }
template <> inline
func<double>::operator double()
{ <<special code for double>> }
.. etc, then ..
int x = func<int>(); // this is OK!
double d = func<double>(); // also OK :)
Ein Vorteil dieser Lösung ist, dass jeder Code, der diese Vorlagendefinitionen enthält, weitere Spezialisierungen für weitere Typen hinzufügen kann. Außerdem können Sie je nach Bedarf partielle Spezialisierungen der Struktur vornehmen. Zum Beispiel, wenn Sie eine spezielle Behandlung für Zeigertypen wünschen:
template <typename T>
struct func<T*>
{
operator T*()
{ <<special handling for T*>> }
};
Negativ ist, dass Sie nicht schreiben können int x = func();
mit meiner Lösung. Sie müssen schreiben int x = func<int>();
. Sie müssen explizit sagen, was der Rückgabetyp ist, anstatt den Compiler zu bitten, es durch Typumwandlungsoperatoren herauszufinden. Ich würde sagen, dass "meine" Lösung und die von A.Rex beide in eine pareto-optimale Front von Möglichkeiten, dieses C++-Dilemma zu bewältigen :)
2 Stimmen
Mögliche Duplikate von Überladen einer C++-Funktion entsprechend dem Rückgabewert
0 Stimmen
@user195488 dies ist kein Duplikat, weil es eine allgemeine Frage ist.