Generics a šablon (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