Częściowa kolejność funkcji szablonów (C++)
Wiele szablonów funkcji, które spełniają kryteria listy argumentów wywołania funkcji mogą być dostępne.C++ definiuje częściowe zamawiania funkcji szablonów, aby określić, której funkcji należy wywołać.Kolejność jest częściowa, ponieważ może to być niektóre szablony, które są uznawane za jednakowo wyspecjalizowane.
Kompilator wybiera najbardziej wyspecjalizowanych funkcji szablonu dostępne z możliwych dopasowań.Na przykład, jeśli szablon funkcja ma typ ti innego szablonu funkcję, biorąc pod T * jest dostępna, T * wersji mówi się, że należy bardziej wyspecjalizowane i jest preferowane rodzajową t wersji w każdym przypadku, gdy argument jest typ wskaźnika, mimo że oba byłoby dopuszczalne odpowiedników.
Aby określić, jeśli jeden kandydat szablonu funkcji jest bardziej wyspecjalizowane należy przeprowadzić następujący proces:
Należy wziąć pod uwagę dwa szablony funkcji T1 i T2.
Zastąp parametrów w T1 hipotetyczny typu unikatowego X.
Z listy parametr w T1 należy sprawdzić, czy T2 jest prawidłowym szablonem dla tej listy parametrów.Ignoruj wszystkie konwersje niejawne.
Powtórzyć ten sam proces T1 i T2, odwrócona.
Jeśli jeden szablon jest prawidłowy szablon listy argumentów, dla innego szablonu, ale przeciwną stronę nie jest spełniony, tego szablonu jest uważane za jako wyspecjalizowane mniejsze niż inne szablonu.Jeśli szablony, zarówno przy użyciu poprzedniego kroku tworzą nieprawidłowe argumenty dla siebie, następnie są one uważane za być jednakowo wyspecjalizowany i spowoduje wywołanie niejednoznaczne, podczas próby użycia je.
Przy użyciu tych reguł:
Bardziej skomplikowane niż jeden argument typu rodzajowego biorąc specjalizacji szablon dla określonego typu.
Szablon, uwzględniając tylko T * jest bardziej skomplikowane niż tylko jeden biorąc t, ponieważ hipotetyczną wpisz X * jest prawidłowym argumentem dla t argumentu szablon, ale x nie jest prawidłowym argumentem dla T * argument szablonu.
Const t jest bardziej skomplikowane niż t, ponieważ const x jest prawidłowym argumentem dla t argumentu szablon, ale x nie jest prawidłowym argumentem dla const t argument szablonu.
Const T * jest bardziej skomplikowane niż T *, ponieważ const X * jest prawidłowym argumentem dla T * argumentu szablon, ale X * nie jest prawidłowym argumentem dla const T * argument szablonu.
Poniższy przykład działa w programie Visual C++.NET 2003, jak określono w normie:
// partial_ordering_of_function_templates.cpp
// compile with: /EHsc
#include <iostream>
extern "C" int printf(const char*,...);
template <class T> void f(T) {
printf_s("Less specialized function called\n");
}
template <class T> void f(T*) {
printf_s("More specialized function called\n");
}
template <class T> void f(const T*) {
printf_s("Even more specialized function for const T*\n");
}
int main() {
int i =0;
const int j = 0;
int *pi = &i;
const int *cpi = &j;
f(i); // Calls less specialized function.
f(pi); // Calls more specialized function.
f(cpi); // Calls even more specialized function.
// Without partial ordering, these calls would be ambiguous.
}
Dane wyjściowe
Less specialized function called
More specialized function called
Even more specialized function for const T*