Udostępnij za pośrednictwem


Generyczne i szablony (Visual C++)

Generyczne i szablony są zarówno funkcje języka, które zapewniają obsługę typów sparametryzowanej.Jednakże są różne i mają różne zastosowania.W tym temacie omówiono wiele różnic.

Aby uzyskać więcej informacji, zobacz Środowisko wykonawcze systemu Windows i zarządzane szablony (C++ Component Extensions) i Omówienie szablonów.

Porównanie szablony i generyczne

Podstawowe różnice między typy ogólne i szablonów języka C++:

  • Generyczne są ogólne, dopóki typy podstawiane w miejsce ich w czasie wykonywania.Szablony są wyspecjalizowane w czasie kompilować , więc nie są nadal sparametryzowana typów w czasie wykonywania

  • aparat plików wykonywalnych języka wspólnego obsługuje specjalnie typy ogólne MSIL.Ponieważ środowisko wykonawcze wie o typy ogólne, określonych typów mogą być substytutami typy rodzajowe przy odwoływaniu się do zestaw zawierającego typ ogólny.Szablony, natomiast rozpoznać do zwykłych typów w czasie kompilować i typy wynikowy nie może być specjalizujących się w innych zestawów.

  • Generyczne specjalizujących się w dwóch różnych zestawów z tego samego typu argumenty są tego samego typu.Szablony specjalizujących się w dwóch różnych zestawów z tego samego typu, które argumenty są uważane za w czasie wykonywania różnych typów.

  • Generyczne są generowane jako pojedynczego fragmentu kodu wykonywalnego, który jest używany dla wszystkich argumentów typ referencyjny (nie jest to prawdą dla typów wartości, które mają unikatowe wykonania według typ wartości).kompilator JITwie o typy ogólne i jest zdolny do optymalizować kodu dla typów odniesienia lub wartości, które są używane jako argumenty typu. Szablony wygenerować kod oddzielnych runtime, dla każdej specjalizacji.

  • Generyczne nie pozwalają parametrów-type szablon , takich jak template <int i> C {}.Szablony umożliwiają im.

  • Generyczne nie pozwalają wyraźnej specjalizacji (to znaczy niestandardowej implementacji szablon dla określonego typu).Do szablonów.

  • Generyczne nie pozwalają na częściowo specjalizacji (niestandardowej implementacji dla podzbioru argumentów typu).Do szablonów.

  • Generyczne nie pozwalają na typ parametr służyć jako klasa bazowa dla typ ogólny.Do szablonów.

  • Szablony obsługują szablon- parametryszablon (np.template<template<class T> class X> class MyClass), ale nie typy ogólne .

Łączenie szablony i generyczne

  • Podstawowa różnica w typy ogólne ma znaczenie dla tworzenia aplikacji, które łączą szablony i typy ogólne.Na przykład załóżmy, że masz klasy szablon , który chcesz utworzyć rodzajowy otoka dla tego szablon do innych języków jako rodzajowego narazić.Nie może mieć take rodzajowy typ parametr , który następnie przekazuje choć do szablon, ponieważ szablon musi mieć typ parametr w czasie kompilować , ale rodzajową nie rozpoznać typu parametr do wykonywania.Zagnieżdżanie szablon wewnątrz rodzajowego nie będzie działać albo ponieważ nie istnieje sposób, aby rozwinąć szablony w czasie kompilować dla dowolnego typy rodzajowe, które mogłyby posłużyć do utworzenia w czasie wykonywania.

Przykład

sbh15dya.collapse_all(pl-pl,VS.110).gifOpis

Poniższy przykład pokazuje prosty przykład przy użyciu szablonów i typy ogólne .W tym przykładzie klasy szablon przekazuje jej poprzez parametr typ ogólny.Odwrotna nie jest możliwe.

Można to idiom, chcesz kompilacja na istniejących rodzajowy interfejs API z kodu szablon , który jest lokalny Visual C++ zestawlub gdy trzeba dodać dodatkową warstwę parametryzacja typ ogólny, aby korzystać z niektórych funkcji szablony nie są obsługiwane przez typy ogólne.

sbh15dya.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

F

Zobacz też

Inne zasoby

Typy ogólne (C++ Component Extensions)