Универсальные типы и шаблоны (Visual C++)
Универсальные шаблоны и шаблоны обе функции языка, предоставляют поддержку для параметризованных типов.Однако они отличаются и имеют другую.Этот раздел предоставляет обзор много различий.
Дополнительные сведения см. в разделах Среда выполнения Windows и управляемые шаблоны (расширения компонентов C++) и Общие сведения о шаблонах.
Сравнение шаблонов и универсальные шаблоны
Ключевые различия между универсальными шаблонами и шаблонами C++:
Универсальные шаблоны родовы до тех пор, пока типы не заменяются для них во время выполнения.Шаблоны специализированы во время компиляции, поэтому они не все еще параметризованных типов во время выполнения
Среда CLR не поддерживает универсальные шаблоны в MSIL.Поскольку среда выполнения знает об универсальных шаблонах, определенные типы можно заменить для универсальных типов ссылок на сборки, содержащий универсальный тип.Шаблоны, напротив, позволяющие в обычных типов во время компиляции и результирующие типы не могут быть специализированы в других сборках.
Универсальные шаблоны специализированные в 2 различных сборках с теми же аргументами типа тот же тип.Считается, что средой выполнения будут специальные шаблоны в 2 различных сборках с теми же аргументами типа разными типами.
Создавать универсальные шаблоны, так как одна часть исполняемого кода, используемый для всех аргументов ссылочного типа (это не относится к типов значений, которые имеют уникальные реализацию в тип значения).JIT-компилятор знает об универсальных шаблонах и может оптимизировать код для ссылок или типов значения, которые используются в качестве аргументов типа.Шаблоны создают отдельный код времени выполнения для каждой специализации.
Универсальные шаблоны не принимают параметры шаблона non-типа, как template <int i> C {}.Шаблоны позволяют их.
Универсальные шаблоны не допускают явная специализация (то есть, пользовательская реализация шаблона для конкретного типа).Шаблоны.
Универсальные шаблоны (не разрешены частично специализация пользовательскую реализацию для подмножества аргументов типа).Шаблоны.
Универсальные шаблоны не принимают параметр типа, используемый в качестве базового класса для универсального типа.Шаблоны.
Параметры шаблон-шаблона обозреватель шаблонов (например.template<template<class T> class X> class MyClass), а универсальные шаблоны.
Комбинирование шаблоны и универсальные шаблоны
- Основное различие в универсальных шаблонах соблюдения для создания приложений, сочетающие шаблоны и универсальные шаблоны.Например, предположим, что имеется класс шаблона, для которого требуется создать родовая программа-оболочка для предоставления этот шаблон в других языках, как универсальный шаблон.Нельзя использовать универсальный шаблон принимает параметр типа, который затем он передает однако к шаблону, поскольку шаблон должен иметь этот тип параметра во время компиляции, но универсальный шаблон не поддерживает параметр типа до времени выполнения.Вложение в шаблон универсального не будет работать, поскольку не существует способа развернуть шаблоны во время компиляции для произвольных универсальных типов, которые могут создаваться во время выполнения.
Пример
Описание
Следующий пример показывает простой пример шаблонов и универсальных шаблонов использования вместе.В этом примере класс шаблона передает параметр в универсальному типу.Обратное невозможно.
Этот идиоматизм может быть использован, когда требуется создать на существующем родовом API с кодом шаблона, локальный на сборку Visual C++, либо когда необходимо добавить дополнительный слой параметризации к универсальному типу, чтобы воспользоваться преимуществами шаблонов некоторых функций, не поддерживаемых универсальными шаблонами.
Код
// templates_and_generics.cpp
// compile with: /clr
using namespace System;
generic <class ItemType>
ref class MyGeneric {
ItemType m_item;
public:
MyGeneric(ItemType item) : m_item(item) {}
void F() {
Console::WriteLine("F");
}
};
template <class T>
public ref class MyRef {
MyGeneric<T>^ ig;
public:
MyRef(T t) {
ig = gcnew MyGeneric<T>(t);
ig->F();
}
};
int main() {
// instantiate the template
MyRef<int>^ mref = gcnew MyRef<int>(11);
}
Output
F