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


Универсальные типы и шаблоны (Visual C++)

Универсальные шаблоны и шаблоны обе функции языка, предоставляют поддержку для параметризованных типов.Однако они отличаются и имеют другую.Этот раздел предоставляет обзор много различий.

Дополнительные сведения см. в разделах Среда выполнения Windows и управляемые шаблоны (расширения компонентов C++) и Общие сведения о шаблонах.

Сравнение шаблонов и универсальные шаблоны

Ключевые различия между универсальными шаблонами и шаблонами C++:

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

  • Среда CLR не поддерживает универсальные шаблоны в MSIL.Поскольку среда выполнения знает об универсальных шаблонах, определенные типы можно заменить для универсальных типов ссылок на сборки, содержащий универсальный тип.Шаблоны, напротив, позволяющие в обычных типов во время компиляции и результирующие типы не могут быть специализированы в других сборках.

  • Универсальные шаблоны специализированные в 2 различных сборках с теми же аргументами типа тот же тип.Считается, что средой выполнения будут специальные шаблоны в 2 различных сборках с теми же аргументами типа разными типами.

  • Создавать универсальные шаблоны, так как одна часть исполняемого кода, используемый для всех аргументов ссылочного типа (это не относится к типов значений, которые имеют уникальные реализацию в тип значения).JIT-компилятор знает об универсальных шаблонах и может оптимизировать код для ссылок или типов значения, которые используются в качестве аргументов типа.Шаблоны создают отдельный код времени выполнения для каждой специализации.

  • Универсальные шаблоны не принимают параметры шаблона non-типа, как template <int i> C {}.Шаблоны позволяют их.

  • Универсальные шаблоны не допускают явная специализация (то есть, пользовательская реализация шаблона для конкретного типа).Шаблоны.

  • Универсальные шаблоны (не разрешены частично специализация пользовательскую реализацию для подмножества аргументов типа).Шаблоны.

  • Универсальные шаблоны не принимают параметр типа, используемый в качестве базового класса для универсального типа.Шаблоны.

  • Параметры шаблон-шаблона обозреватель шаблонов (например.template<template<class T> class X> class MyClass), а универсальные шаблоны.

Комбинирование шаблоны и универсальные шаблоны

  • Основное различие в универсальных шаблонах соблюдения для создания приложений, сочетающие шаблоны и универсальные шаблоны.Например, предположим, что имеется класс шаблона, для которого требуется создать родовая программа-оболочка для предоставления этот шаблон в других языках, как универсальный шаблон.Нельзя использовать универсальный шаблон принимает параметр типа, который затем он передает однако к шаблону, поскольку шаблон должен иметь этот тип параметра во время компиляции, но универсальный шаблон не поддерживает параметр типа до времени выполнения.Вложение в шаблон универсального не будет работать, поскольку не существует способа развернуть шаблоны во время компиляции для произвольных универсальных типов, которые могут создаваться во время выполнения.

Пример

sbh15dya.collapse_all(ru-ru,VS.110).gifОписание

Следующий пример показывает простой пример шаблонов и универсальных шаблонов использования вместе.В этом примере класс шаблона передает параметр в универсальному типу.Обратное невозможно.

Этот идиоматизм может быть использован, когда требуется создать на существующем родовом API с кодом шаблона, локальный на сборку Visual C++, либо когда необходимо добавить дополнительный слой параметризации к универсальному типу, чтобы воспользоваться преимуществами шаблонов некоторых функций, не поддерживаемых универсальными шаблонами.

sbh15dya.collapse_all(ru-ru,VS.110).gifКод

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

sbh15dya.collapse_all(ru-ru,VS.110).gifOutput

F

См. также

Другие ресурсы

Универсальные типы и методы (расширения компонентов C++)