Poniższe nie wygląda na częściowespecjalizacja (która jednak nie może mieć miejsca w przypadku funkcji szablonowej). Funkcje Plus nie przeciążają po prostu typem zwracanym. Co się dzieje w następującym kodzie?
#include <iostream>
#include <string>
#include <vector>
template<typename T>
T foo() {
std::cout << "first";
return T();
}
template<typename T, typename U>
std::pair<T,U> foo() {
std::cout << "second";
return std::make_pair<T,U>(T(),U());
}
int main()
{
foo<int>();
foo<int,char>();
}
Odpowiedzi:
2 dla odpowiedzi № 1Masz dwa przeciążenia foo
(tak naprawdę nazwano dwa szablony funkcji foo
). Jeden bierze jeden argument typu szablonu:
template<typename T>
T foo();
I jeden bierze dwa argumenty typu szablonu:
template<typename T, typename U>
std::pair<T,U> foo();
Możesz przeciążać różne argumenty szablonu. Możesz nawet dodać przeciążenia, które przyjmują argumenty nietypowe:
template <int I>
void foo() {
std::cout << "third";
}
Jest to również osobne, ważne przeciążenie. To, czego nie możesz zrobić, to osobno dodać:
template <typename U>
U* foo();
Ponieważ teraz masz dwa różne szablony funkcji o nazwie foo
które wymagają pojedynczego argumentu szablonu i kompilator nie może wiedzieć, który miał na myśli - teraz masz zagwarantowane niejednoznaczne przeciążenie.
0 dla odpowiedzi nr 2
Nie nazwałbym tego przeciążeniem, ale kompilator wygeneruje dwie różne funkcje na podstawie argumentów szablonu.