Możesz używać specjalizacji, gdy wiesz, że dla konkretnej klasy skuteczna może być metoda ogólna.
template<typename T>
void MySwap(T& lhs, T& rhs)
{
T tmp(lhs);
lhs = rhs;
rhs = tmp;
}
Teraz dla wektorów mój zamiana będzie działać, ale nie jest zbyt skuteczny. Ale wiem też, że std :: vector implementuje własną metodę swap().
template<>
void MySwap(std::vector<int>& lhs,std::vector<int>& rhs)
{
lhs.swap(rhs);
}
Proszę nie porównywać do std :: swap, które jest dużo bardziej złożone i lepiej napisane. Jest to tylko przykład pokazujący, że standardowa wersja MySwap() będzie działać, ale nie zawsze może być wydajna. W rezultacie pokazałem, jak można go usprawnić dzięki specjalnej specjalizacji szablonu.
Możemy oczywiście użyć przeciążenia, aby uzyskać ten sam efekt.
void MySwap(std::vector<int>& lhs,std::vector<int>& rhs)
{
lhs.swap(rhs);
}
Więc pytanie, dlaczego warto korzystać ze specjalizacji szablonów (jeśli można użyć przeciążenia). Dlaczego rzeczywiście. Funkcja bez szablonu będzie zawsze wybierana przez funkcję szablonu. Więc zasady specjalizacji szablonów nie są nawet wywoływane (co sprawia, że życie jest o wiele prostsze, ponieważ reguły te są dziwne, jeśli nie jesteś prawnikiem, a także programistą komputerowym). Więc pozwól mi coś na sekundę. Nie można wymyślić dobrego powodu.
być może biorąc adres: '& foo vs (void (...)) foo' lub specjalizujący się typ zwrotu? –
Anycorn
możliwy duplikat [Znaczenie i konieczność specjalizacji szablonu funkcji] (http://stackoverflow.com/questions/2197141/function-template-specialization-importance-and-necessity) – jamesdlin