Compartilhar via


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:

  1. Considere os dois modelos de função, T1 e T2.

  2. Substitua os parâmetros no T1 com um tipo exclusivo hipotético X.

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

  4. Repita o mesmo processo com T1 e T2 revertidas.

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

  6. Usando essas regras:

    1. Uma especialização de modelo para um tipo específico é mais especializada do que aquela levando um argumento de tipo genérico.

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

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

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

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

zaycz069.collapse_all(pt-br,VS.110).gifSaída

Less specialized function called
More specialized function called
Even more specialized function for const T*

Consulte também

Referência

Modelos de função