Tempo de Execução do Windows e Modelos Gerenciados (Extensões de Componentes C++)

Os modelos permitem que você definir um protótipo de um tempo de execução do Windows ou o tipo Common Language Runtime e, em seguida, criar uma instância variações desse tipo usando parâmetros de tipo de outro modelo .

Todos os tempos de execução

Você pode criar modelos de tipos de valor ou referência.Para obter mais informações sobre como criar tipos de valor ou referência, consulte Classes e Estruturas (Extensões de Componentes C++).

Para obter mais informações sobre modelos de classe do C++ padrão, consulte Modelos de classe.

Tempo de execução do Windows

(Existem sem comentários para esse recurso do idioma que aplicar somente ao runtime do Windows).

ms177213.collapse_all(pt-br,VS.110).gifRequisitos

Opção de compilador:/ZW

Common Language Runtime

Existem algumas limitações para a criação de modelos de classe de tipos gerenciado , que são demonstrados nos exemplos de código a seguir.

ms177213.collapse_all(pt-br,VS.110).gifRequisitos

Opção de compilador:/clr

ms177213.collapse_all(pt-br,VS.110).gifExemplos

Exemplo

É possível criar uma instância de um tipo genérico com um gerenciado tipo do modeloparâmetro, mas você não é possível instanciar um gerenciadomodelo com umparâmetrodemodelode tipo genérico. Isso ocorre porque os tipos genéricos são resolvidos em tempo de execução.Para mais informações, consulte Genéricos e modelos (Visual C++).

// managed_templates.cpp
// compile with: /clr /c

generic<class T> 
ref class R; 

template<class T> 
ref class Z {
   // Instantiate a generic with a template parameter.
   R<T>^ r;    // OK
};

generic<class T> 
ref class R {
   // Cannot instantiate a template with a generic parameter.
   Z<T>^ z;   // C3231
};

Exemplo

Um tipo genérico ou a função não pode ser aninhado em ummodelode gerenciado.

// managed_templates_2.cpp
// compile with: /clr /c

template<class T> public ref class R {
   generic<class T> ref class W {};   // C2959
};

Exemplo

Você não pode acessar os modelos definidos em um assembly referenciado com C + + / sintaxe de linguagem do CLI, mas você pode usar a reflexão.Se um modelo não é instanciado, ele não é emitido nos metadados.Se um modelo é instanciado, apenas as funções de membro referenciado aparecerão nos metadados.

// managed_templates_3.cpp
// compile with: /clr

// Will not appear in metadata.
template<class T> public ref class A {};

// Will appear in metadata as a specialized type.
template<class T> public ref class R {
public:
   // Test is referenced, will appear in metadata
   void Test() {}

   // Test2 is not referenced, will not appear in metadata
   void Test2() {}
};

// Will appear in metadata.
generic<class T> public ref class G { };

public ref class S { };

int main() {
   R<int>^ r = gcnew R<int>;
   r->Test();
}

Exemplo

Você pode alterar o modificador gerenciado de uma classe em uma especialização parcial ou especialização explícita de ummodelode classe.

// managed_templates_4.cpp
// compile with: /clr /c

// class template
// ref class
template <class T>
ref class A {};

// partial template specialization
// value type
template <class T>
value class A <T *> {};

// partial template specialization
// interface
template <class T> 
interface class A<T%> {};

// explicit template specialization
// native class
template <>
class A <int> {};

Consulte também

Conceitos

Extensões de componente para plataformas de tempo de execução