Zauważyłem, że istnieje asymetria między podpisaniem używane do odróżnienia unikalne funkcje szablonów, a podpis używany do odróżnienia unikalne funkcje (w tym wystąpienia z funkcji szablonów).Jak rozróżniać szablony funkcji, które różnią się tylko typem zwrotnym?
W szczególności funkcji matrycy, różniące się jedynie ze względu na rodzaj powrotnej uważa się być unikalna, podczas gdy funkcje, które różnią się tylko przez rodzaj powrotnej uważa się za zbędne.
Dlatego mam odpowiednie pytanie na temat sposobu disambiguate między szablonami funkcyjnymi, które różnią się tylko przez typ zwracany, w momencie konkretyzacji:
#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?
}
W powyższym kodzie, konkretyzacją funkcji szablonu foo
jest niejednoznaczna właśnie z powodu wspomnianej przeze mnie asymetrii. Obecność dwóch definicji funkcji szablon jest legalny, ale instancji jest nielegalne, nawet jeśli typ zwracany jest określony w tej samej linii kodu.
Zadaję to pytanie czysto teoretyczne dla celów uczenia się. Być może ten konstrukt kodu, w rzeczywistości, byłby oznaką złego projektu. Być może nigdy nie powstanie w prawdziwym życiu. Również mogę sobie wyobrazić różne sposoby przezwyciężenia tego problemu poprzez zmianę definicji szablonu (lub dokonywanie innych zmian).
Mimo to chciałbym się dowiedzieć, czy zachowując definicje szablonów bez zmian, możliwe jest ujednoznacznienie między tymi dwiema funkcjami szablonu w punkcie tworzenia.
+1 , Nigdy o tym nie myślałem. Brzydki, ale poprawny. BTW, 'static_cast (foo) (d)' zmniejsza 1 znak :) –
iammilind
Idealny. Teraz moja wiara w szablony funkcjonalne została przywrócona. Zaczęłam się zastanawiać, dlaczego funkcyjne podpisy szablon to typ zwracany - jeżeli nie mogą one być ujednoznacznione kiedykolwiek. Ale, jak pokazuje twoja doskonała odpowiedź, mogą. –