Compartilhar via


Visão geral de modelos

Os modelos, que às vezes são chamados de tipos com parâmetros, são mecanismos para a geração de funções e classes com base em parâmetros de tipo.Usando modelos, você pode criar uma única classe ou uma função que opera nos dados de vários tipos, em vez de ter que criar uma classe separada para cada tipo.

Comentários

Por exemplo, para criar uma função de typesafe que retorna o mínimo de dois parâmetros sem usar modelos, você escreveria um conjunto de funções sobrecarregadas como este:

// what_are_templates1.cpp
// compile with: /c
// min for ints
int min( int a, int b ) {
   return ( a < b ) ? a : b;
}

// min for longs
long min( long a, long b ) {
   return ( a < b ) ? a : b;
}

// min for chars
char min( char a, char b ) {
   return ( a < b ) ? a : b;
}

Usando modelos, você pode reduzir essa duplicação para um modelo de função única:

// what_are_templates2.cpp
// compile with: /c
template <class T> T min( T a, T b ) {
   return ( a < b ) ? a : b;
}

Modelos podem significativamente reduzir o tamanho do código fonte e aumentar a flexibilidade de código sem reduzir a segurança de tipos.

Existem dois tipos principais de modelos: modelos e modelos de classe de função.No exemplo anterior, min é um modelo de função.Um modelo de classe é uma classe com um parâmetro, como:

// what_are_templates3.cpp
template <class T> class A {
   T m_t;
   public:
      A(T t): m_t(t) {} 
      void f(T t);
};

int main() {
   A<int> a(10);
}

Os modelos são declarados e definidos um pouco como outras funções e classes, com algumas diferenças importantes.Uma declaração de modelo não totalmente define uma função ou classe. Ele define somente um esqueleto sintático de uma classe ou função.Uma função ou classe real é criada a partir de um modelo por um processo chamado instanciação.As classes individuais ou funções criadas são chamadas para criar uma instância.Por exemplo, um modelo de classe:

template <class T> struct A { . . . };

pode ser usado para instanciar classes para A<int>, A<char>, A<int*>, A<MyClass*>e assim por diante.

Pode ser feita a instanciação de classes ou funções explícita ou implicitamente.Instanciação explícita é uma maneira de chamar no código quais versões do modelo devem ser gerados.Instanciação implícita permite que os modelos ser instanciado conforme necessário no ponto em que são usadas pela primeira vez.

Modelos também podem ser parametrizados por um parâmetro de valor, na qual caso o parâmetro do modelo é declarado como o parâmetro para uma função.Tipos de ponto flutuante e tipos de classe não são permitidos como parâmetros de valor.

// what_are_templates4.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

template <int i> class A {
   int array[i];
public:
   A() { memset(array, 0, i*sizeof(int)); }
};

int main() {
   A<10> a;
}

Um problema comum com modelos é que elas podem ser uma solução única para tudo, o que significa que o mesmo código se aplica a todos os tipos.Se você precisar personalizar o comportamento do modelo para um determinado tipo, você pode usar a especialização.Com especialização explícita, um modelo pode ser especializado para um determinado tipo real, não é um tipo genérico.Um modelo de classe pode também ser parcialmente especializado, que é útil se você tiver um modelo com vários parâmetros de tipo e você deseja personalizar o comportamento em relação a algumas, mas nem todos os parâmetros.Uma especialização parcial é ainda genérica e precisa de argumentos de modelo real para produzir uma classe instanciada real.

Consulte também

Outros recursos

Modelos