Sdílet prostřednictvím


Obecné typy a šablony (Visual C++)

Generics a šablony jsou obě funkce jazyka, které podporují parametrické typy.Však se liší a mají různé použití.Toto téma obsahuje přehled mnoho rozdílů.

Další informace naleznete v tématu Windows Runtime a spravované šablony (rozšíření komponent C++) a Přehled šablon.

Porovnání šablony a Generics

Hlavní rozdíly mezi obecné typy a šablony jazyka C++:

  • Generics jsou obecné, dokud typy jsou nahrazena jim za běhu.Šablony jsou specializované v době kompilovat , tak nejsou stále parametrizované typy za běhu

  • modul CLR (Common Language Runtime) speciálně podporuje MSIL obecné typy .Protože runtime ví o obecné typy, určité typy mohou nahradit obecné typy při odkazování na sestavení obsahující obecný typ.Šablony, naopak přeložit do běžných typů v době kompilovat a výsledné typů může specializované není v ostatních sestaveních.

  • Generics specializovaných na dvou různých sestav se stejným typem argumenty jsou stejného typu.Šablony specializované ve dvou různých sestav s stejného typu, které argumenty jsou považovány za modulem runtime různých typů.

  • Generics jsou generovány jako jediný spustitelný soubor kód, který se používá pro všechny argumenty typu odkazovat se (to neplatí pro typy hodnot, které mají jedinečné provádění každého hodnota).kompilátor za běhuví o obecné typy a je možné optimalizovat kód pro typy hodnotou nebo odkazovat se , které se používají jako argumenty typu. Šablony vygenerovat kód samostatné runtime pro každou odbornost.

  • Generics neumožňují parametry-type šablona , například template <int i> C {}.Šablony umožňují jim.

  • Generics neumožňuje explicitní specializace (tedy vlastní implementaci šablona pro konkrétní typ).Do šablony.

  • Generics neumožňují částečný kód specializace (vlastní implementaci pro dílčí argumenty typu).Do šablony.

  • Generics neumožňují k použití jako základní třída pro obecný typtyp parametr .Do šablony.

  • Šablony podporují (například šablona- parametryšablonatemplate<template<class T> class X> class MyClass), ale nejsou obecné typy .

Diakritické znaménko šablony a Generics

  • Základní rozdíl v obecné typy má důsledky pro vytváření aplikací, které kombinují šablony a obecné typy.Předpokládejme například, že máte šablona třída , kterou chcete vytvořit obecný obálka pro vystavení šablona do jiných jazyků jako obecný.Obecný vzít nemůže mít typ parametr , který pak předá když šablona, protože šablona musí mít parametr typu v čase kompilovat , ale obecného nelze přeložit typu parametr až za běhu.šablona uvnitř obecný vnoření nefunguje buď protože neexistuje žádný způsob, jak rozbalit šablony v době kompilovat pro libovolného obecné typy, které by mohla být vytvořena za běhu.

Příklad

Description

Následující příklad ukazuje jednoduchý příklad společně pomocí šablon a obecné typy .V tomto příkladu šablonapředá parametr prostřednictvím obecný typ. Naopak není možné.

Tento idiomu lze použít k sestavení na stávající obecné API, s kódem šablona , který je místní Visual C++ sestavenínebo potřebujete přidat další vrstvu Parametrizace obecný typvyužít některé funkce šablony nepodporuje obecné typy.

Kód

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

Výsledek

F

Viz také

Další zdroje

Obecné typy (rozšíření komponent C++)