Částečné řazení funkce šablony (C++)
Více šablon funkce, které odpovídají argumentu volání funkce mohou být k dispozici.C++ definuje částečné řazení funkce šablony určete funkci, která by měla být volána.Řazení je částečná, protože mohou být některé šablony, které jsou považovány za stejně specializované.
Kompilátor z možných shod Vybere největší specializované funkce šablony k dispozici.Například pokud má funkce šablony typu ta jiné funkce šablony, přičemž T * je k dispozici, T * verze se říká, že se více specializované a má přednost obecného t verze vždy, když argument typ ukazatele, přestože by být přípustné shod.
Určení, pokud jedna funkce šablony kandidát více specializované, použijte následující postup:
Zvážit dvě funkce šablony, T1 a T2.
Hypotetický jedinečný typ x nahraďte parametry T1.
Pomocí seznamu parametrů T1 zobrazit Pokud T2 je platná šablona pro tento parametr seznam.Ignorujte všechny implicitní převody.
Zopakujte stejný proces s T1 a T2 převrácené.
Pokud je jedna šablona seznamu argument platná šablona pro jiné šabloně, ale není převést hodnotu true, být že menší než jiné šabloně specializované za šablony.Pokud obě šablony pomocí předchozího kroku formuláře platné argumenty pro sebe, pak jsou považovány za stejně být specializované a nejednoznačných volání bude výsledkem pokusu o jejich použití.
Pomocí těchto pravidel:
Šablona specializace pro určitý typ je specializované více než jedna, přičemž obecný typ argumentu.
Šablony, přičemž pouze T * je specializované více než jeden bere pouze t, protože hypotetickou zadejte X * je platný argument pro t argument šablony, ale x není platný argument pro T * argument šablony.
Const t je specializované více než t, protože const x je platný argument pro t argument šablony, ale x není platný argument pro const t argument šablony.
Const T * je specializované více než T *, protože const X * je platný argument pro T * argument šablony, ale X * není platný argument pro const T * argument šablony.
Následující příklad pracuje v jazyce C++.NET 2003 podle normy:
// 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.
}
Výsledek
Less specialized function called
More specialized function called
Even more specialized function for const T*