Ordem parcial de modelos de função (C++)
Vários modelos de função que correspondem à lista de argumento de uma chamada de função podem estar disponíveis.C++ define uma ordem parcial dos modelos de função para especificar qual função deve ser chamada.A ordenação é parcial porque pode haver alguns modelos que são considerados igualmente especializados.
O compilador escolhe a função do modelo mais especializada disponível de possíveis correspondências.Por exemplo, se um modelo de função leva um tipo de te outro modelo de função levando T * estiver disponível, o T * versão deve ser mais especializado e é preferível a genérica t versão sempre que o argumento é um tipo de ponteiro, mesmo que ambos seria permitidas correspondências.
Use o seguinte processo para determinar se um candidato de modelo de função é mais especializado:
Considere os dois modelos de função, T1 e T2.
Substitua os parâmetros no T1 com um tipo exclusivo hipotético X.
Com a lista de parâmetro em T1, veja se T2 um modelo válido para essa lista de parâmetro.Ignore qualquer conversões implícitas.
Repita o mesmo processo com T1 e T2 revertidas.
Se um modelo é uma lista de argumentos de modelo válido para o outro modelo, mas o inverso não é verdade, esse modelo é considerado para ser que menos especializado que o modelo de outro.Se os dois modelos usando a etapa anterior formam argumentos válidos para si, em seguida, eles são considerados ser igualmente especializado e uma chamada ambígua resultará quando tentar usá-los.
Usando essas regras:
Uma especialização de modelo para um tipo específico é mais especializada do que aquela levando um argumento de tipo genérico.
Um modelo levando apenas T * é mais especializado do que apenas fazer uma t, porque uma empresa de consultoria digite X * é um argumento válido para um t argumento de modelo, mas x não é um argumento válido para um T * argumento de modelo.
Const t é mais especializado do que t, pois x const é um argumento válido para um t argumento de modelo, mas x não é um argumento válido para um t const argumento de modelo.
Const T * é mais especializado do que T *, pois const X * é um argumento válido para um T * argumento de modelo, mas X * não é um argumento válido para um const T * argumento de modelo.
O exemplo a seguir funciona em Visual C++.NET 2003, conforme especificado no padrão:
// 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.
}
Saída
Less specialized function called
More specialized function called
Even more specialized function for const T*