/ / Typ powrotu przeciążonych funkcji szablonowych - c ++

Typ powrotu funkcji typu przeciążeniowego - c ++

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 № 1

Masz 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.