Um modelo é um pouco como uma macro. Com uma macro, invocar um modelo causa expansão (com substituição de parâmetros apropriados) ao código que você escreveu. No entanto, um modelo vai mais longe do que isto para permitir a criação de novas classes com base em tipos que você passar como parâmetros. Essas novas classes implementam tipo-safe maneiras de executar a operação expressa em seu código de modelo.
Modelo bibliotecas como ATL diferem das bibliotecas de classe de C++ tradicionais em que normalmente são fornecidas apenas como código fonte (ou como código-origem com um pouco, suporte a tempo de execução) e não são inerentemente ou necessariamente hierárquicas na natureza. Em vez de derivar de uma classe para obter a funcionalidade desejada, você criar uma instância de uma classe de um modelo.