Obecné typy a šablony (C++/CLI)

Obecné typy a šablony jsou jazykové funkce, které poskytují podporu parametrizovaných typů. Liší se ale a používají se různě. Toto téma obsahuje přehled mnoha rozdílů.

Další informace najdete v tématu prostředí Windows Runtime a spravované šablony.

Porovnání šablon a obecných typů

Hlavní rozdíly mezi obecnými typy a šablonami jazyka C++:

  • Obecné typy jsou obecné, dokud nejsou typy nahrazeny za běhu. Šablony jsou specializované v době kompilace, takže nejsou stále parametrizované typy za běhu.

  • Modul CLR (Common Language Runtime) konkrétně podporuje obecné typy v jazyce MSIL. Vzhledem k tomu, že modul runtime ví o obecných typech, lze při odkazování na sestavení obsahující obecný typ nahradit konkrétní typy. Šablony se naopak přeloží na běžné typy v době kompilace a výsledné typy nemusí být specializované na jiná sestavení.

  • Obecné typy specializované ve dvou různých sestaveních se stejnými argumenty typu jsou stejného typu. Šablony specializované na dvě různá sestavení se stejnými argumenty typu jsou modul runtime považovány za různé typy.

  • Obecné typy se generují jako jeden spustitelný kód, který se používá pro všechny argumenty typu odkazu (to neplatí pro typy hodnot, které mají jedinečnou implementaci na typ hodnoty). Kompilátor JIT ví o obecných typech a dokáže optimalizovat kód pro odkazové nebo hodnotové typy, které se používají jako argumenty typu. Šablony generují samostatný kód modulu runtime pro každou specializaci.

  • Obecné typy neumožňují parametry šablony jiného typu, například template <int i> C {}. Šablony je umožňují.

  • Obecné typy neumožňují explicitní specializaci (to znamená vlastní implementaci šablony pro určitý typ). Šablony se dělají.

  • Obecné typy neumožňují částečnou specializaci (vlastní implementace pro podmnožinu argumentů typu). Šablony se dělají.

  • Obecné typy neumožňují použití parametru typu jako základní třídy pro obecný typ. Šablony se dělají.

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

Kombinování šablon a obecných typů

Základní rozdíl v obecných verzích má vliv na vytváření aplikací, které kombinují šablony a obecné typy. Předpokládejme například, že máte třídu šablony, pro kterou chcete vytvořit obecnou obálku, aby byla tato šablona vystavena jiným jazykům jako obecný. Obecný parametr typu, který poté předá šabloně, nelze použít, protože šablona musí mít tento parametr typu v době kompilace, ale obecný parametr typu nepřeloží, dokud nespustí modul runtime. Vnoření šablony do obecného objektu nebude fungovat ani proto, že neexistuje způsob, jak šablony v době kompilace rozšířit pro libovolné obecné typy, které by se mohly vytvořit instance za běhu.

Příklad

Popis

Následující příklad ukazuje jednoduchý příklad použití šablon a obecných typů dohromady. V tomto příkladu třída šablony předává její parametr do obecného typu. Obrácený postup není možný.

Tento idiom se dá použít, když chcete vytvořit existující obecné rozhraní API s kódem šablony, který je místní pro sestavení C++/CLI, nebo když potřebujete přidat další vrstvu parametrizace do obecného typu, abyste mohli využívat některé funkce šablon, které obecné typy nepodporují.

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

Viz také

Obecné typy