Поделиться через


Среда выполнения Windows и управляемые шаблоны (расширения компонентов C++)

Шаблоны позволяют указать местозаполнитель окна среды выполнения или тип среды CLR, и затем изменения создания экземпляра этого типа с помощью различных типов параметров шаблона.

Все среды выполнения

Можно создавать шаблоны из значений и ссылочных типов.Дополнительные сведения о создании значения и ссылочных типов см. в разделе Классы и структуры (расширения компонентов C++).

Дополнительные сведения о стандартных шаблонов класса C++ см. в разделе Шаблоны класса.

Окна времени выполнения

(Нет примечания для данной функции языка, которые применяются только к окнам среды выполнения.)

ms177213.collapse_all(ru-ru,VS.110).gifТребования

Параметр компилятора: /ZW

Среда CLR

Некоторые ограничения на создание шаблонов класса из управляемых типов, которые демонстрируются в следующих примерах кода.

ms177213.collapse_all(ru-ru,VS.110).gifТребования

Параметр компилятора: /clr

ms177213.collapse_all(ru-ru,VS.110).gifПримеры

Пример

Можно создать универсальный тип с управляемыми параметром шаблона типа, но нельзя создать экземпляр управляемым шаблон с параметром шаблона универсального типа.Это происходит потому, что универсальные типы разрешены во время выполнения.Дополнительные сведения см. в разделе Универсальные типы и шаблоны (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
};

Пример

Универсальный тип или функция не могут быть вложенными в управляемом шаблоне.

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

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

Пример

Невозможно получить доступ к шаблоны, определенные в сборке с синтаксисом языка C++/CLI, но можно использовать отражение.Если шаблон создан, он не испущен в метаданные.Если шаблон создан только на которые ссылается функции-члены отображаются в метаданные.

// 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();
}

Пример

Можно изменить управляемый модификатор класса в частично специализации или явной специализации шаблона класса.

// 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> {};

См. также

Основные понятия

Расширения компонентов для платформ среды выполнения