C++
Przeciążenie szablonu funkcji
Szukaj…
Uwagi
- Normalna funkcja nigdy nie jest powiązana z szablonem funkcji, pomimo tej samej nazwy i tego samego typu.
- Normalne wywołanie funkcji i wygenerowane wywołanie szablonu funkcji są różne, nawet jeśli mają tę samą nazwę, ten sam typ zwrotu i tę samą listę argumentów
Co to jest przeciążenie prawidłowego szablonu funkcji?
Szablon funkcji może zostać przeciążony zgodnie z zasadami przeciążania funkcji innych niż szablon (ta sama nazwa, ale różne typy parametrów), a ponadto przeciążenie jest ważne, jeśli
- Typ zwrotu jest inny lub
- Lista parametrów szablonu jest inna, z wyjątkiem nazewnictwa parametrów i obecności domyślnych argumentów (nie są one częścią podpisu)
W przypadku normalnej funkcji porównywanie dwóch typów parametrów jest łatwe dla kompilatora, ponieważ ma wszystkie informacje. Ale typ w szablonie może jeszcze nie zostać określony. Dlatego reguła, w której dwa typy parametrów są równe, jest tutaj przybliżona i mówi, że typy i wartości niezależne muszą się zgadzać, a pisownia typów zależnych i wyrażeń musi być taka sama (dokładniej, muszą one być zgodne z tak zwane reguły ODR), z tym wyjątkiem, że można zmienić nazwę parametrów szablonu. Jeśli jednak w przypadku tak różnych pisowni dwie wartości w ramach typów są uważane za różne, ale zawsze wystąpią takie same wartości, przeciążenie jest nieprawidłowe, ale kompilator nie wymaga diagnostyki.
template<typename T>
void f(T*) { }
template<typename T>
void f(T) { }
Jest to ważne przeciążenie, ponieważ „T” i „T *” to różne pisownia. Ale poniższe informacje są nieprawidłowe i nie wymagają diagnostyki
template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }
template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }