Přehled Generics v jazyce C++
Generics jsou parametrické typy podporovaných modul CLR (Common Language Runtime).parametrizovaný typ je typ, který je definován s Neznámý typ parametr , při použití obecného určené.
Proč Generics?
C++ podporuje šablony a šablony a obecné typy podporují parametrické typy vytvořit zadané kolekce tříd.Však šablony poskytují kompilovat-Parametrizace čas.Nelze vytvořit odkazovat se sestavení obsahující definice šablona a šablona vytvořit nové specializace.Po kompilaci specializované šablona vypadá jako ostatní třída nebo metoda.Naopak jsou obecné typy emitovány v MSIL jako parametrizovaný typ známé modulem runtime parametrizovaný typ. zdrojová databáze kód, který odkazuje na sestavení obsahující obecný typ můžete vytvořit specializace obecný typ.Další informace na porovnávání šablony Visual C++ a obecné typy Generics a šablon (Visual C++).
Obecné funkce a typy
Typy tříd, jako jsou spravovaných typů může být obecný.Může být například List třída. Typ objekt v seznamu by typu parametr.V případě potřeby můžete List třída pro mnoho různých typů objektů před obecné typy použili jste List , která má System::Object jako typ položka . Ale který by jakýkoli objekt (včetně objektů nesprávný typ) pro použití v seznamu.Tento seznam by volána s netypovou kolekce třída.Nejlépe je kontrola typu v době běhu a vyvoláním výjimka.Nebo možné použít šablona, která ztratí své obecné kvality jednou zkompilován sestavení.Spotřebitelé v sestavení nelze vytvořit vlastní specializace šablona.Generics umožňují vytvořit zadané kolekce tříd, vyslovte příkaz List<int> (Číst jako "Seznam int") a List<double> ("seznam dvojité") který vygeneruje kompilovat- chyba Pokud jste se pokusili vložit typ kolekce nebyla navržena přijmout do zadané kolekce.Kromě toho tyto typy zůstávají obecný po jsou zkompilovány.
Popis syntaxe obecný tříd může být nalezeno v Obecný tříd (C + +/ CLI). nový obor názvů System.Collections.Generic, představuje sadu parametrizované kolekce typů, včetně Dictionary<TKey, TValue>, List<T> a LinkedList<T>.Další informace naleznete v tématu Generics v.NET Framework, knihovna tříd (Příručka programování C#).
Funkce členů statickýa instancetřída , delegáty i globální funkce mohou být také obecný. Obecné funkce může být nezbytné, pokud jsou parametry funkceneznámého typu nebo funkce sám musí pracovat s obecnými typy.V mnoha případech kde System::Object byly použity v minulosti jako parametr typ neznámý objekt obecný typparametr smí být použito, umožňující další typspravovaný kód. Pokus o předání ve funkce nebyl navržen pro by označena jako chyba v čase kompilovat .Pomocí System::Object jako funkceparametr, neúmyslné předávání objekt , aby nebyla funkce určené řešit by nebyly zjištěny a potřebujete nádech neznámý objekt typu pro určitý typ v těle funkce a možnost InvalidCastException účtu. S obecný kód pokusu předat funkce objekt způsobí konflikt typu tak mít správný typ je zaručena těle funkce .
kolekce třídy postavené na obecné typystejné dávky párovat .Kolekce třídy v minulosti by použít System::Object k uložení prvky v kolekce.Vkládání objektů typu kolekce nebyl navržen pro není označena v době kompilovat a často dokonce ani v případě, že objekty byly vloženy.objekt by obvykle přetypovat na jiný typ, pokud byl přístup v kolekce.Pouze v případě, že se nezdařilo tavby by neočekávaný typ zjištěny.Generics tento problém řeší v době kompilovat libovolný kód, který vloží neodpovídá typu (nebo implicitně převést na) po zjištění typu parametr obecnou kolekce.
Popis syntaxe, viz Obecné funkce (C + +/ CLI).
Terminologie použitá S Generics
Parametry typu
Obecné prohlášení obsahuje jeden nebo více typů neznámý známé jako Parametry typu.Parametry typu jsou uvedeny název, který zastupuje typ v těle obecné prohlášení.Typ parametr se používá jako typ v rámci těla obecné prohlášení.Obecné prohlášení pro seznam <T> typ parametr T.
Argumenty typu
Typ argument je skutečný typ specializovaný pro určitý typ nebo typy obecného při namísto typu parametr .Například int je typ argument v List<int>.Typy hodnotu a popisovač jsou pouze typy povolených v jakoargument obecný typ.
Typ konstrukce
Typ vyrobeno z obecný typ je označována jako vyrobeno typu.Typ není zcela určen, jako například List<T> je otevřený vyrobeno typu; plně určen, jako například typ List<double>, je uzavřeného typu vyrobeno nebo Typ.Otevřít vypočtené typů v definici jiné obecné typy nebo metody mohou být použity a nesmí být zadán plně dokud obecný orámování je zadán.Například je použití typu otevřený konstruovány jako základní třída pro obecný:
// generics_overview.cpp
// compile with: /clr /c
generic <typename T>
ref class List {};
generic <typename T>
ref class Queue : public List<T> {};
Omezení
omezení je omezení typů, které mohou být použity jako parametrtypu.Obecná dané třída například nelze přijmout pouze třídy, které dědí atributy určené třídanebo implementují zadané rozhraní.Další informace naleznete v tématu Omezení na Obecné zadejte parametry (C + +/ CLI).
Referenční typy a hodnoty
Úchyty typy a hodnoty mohou sloužit jako argumenty typu.Obecná definice, ve kterém mohou být použity buď typ, je syntaxe, typy odkazovat se .Například **->**operátor slouží k přístupu k členy typu typ parametr , zda je typ nakonec použit typ odkazovat se nebo hodnota. Při použití hodnota jako argumenttyp modulu runtime generuje kód, který používá typy hodnot přímo bez zabalení typy hodnot.
Při použití typu odkazovat se jakoargument obecný typ, použijte syntaxi popisovač . Při použití hodnota jako obecný typ argument, použijte přímo název typu.
// generics_overview_2.cpp
// compile with: /clr
generic <typename T>
ref class GenericType {};
ref class ReferenceType {};
value struct ValueType {};
int main() {
GenericType<ReferenceType^> x;
GenericType<ValueType> y;
}
Parametry typu
Parametry typu generic třída zacházeno stejně jako jiné identifikátory.Protože typ není znám, existují však omezení jejich použití.Nelze například použít členů a metody pro parametrtyputřída , pokud podporují tyto členy známý typ parametr . Je členem přístup prostřednictvím typu parametr, musíte přidat typ obsahující člena do seznamu omezení typu parametr.
// generics_overview_3.cpp
// compile with: /clr
interface class I {
void f1();
void f2();
};
ref struct R : public I {
virtual void f1() {}
virtual void f2() {}
virtual void f3() {}
};
generic <typename T>
where T : I
void f(T t) {
t->f1();
t->f2();
safe_cast<R^>(t)->f3();
}
int main() {
f(gcnew R());
}
Tyto omezení párovat také subjektům.Bez omezení obecný typparametr nelze použít == a != operátory v případě, že typ nepodporuje tyto operátory porovnání dvou instancí typu parametr. Tyto kontroly jsou nezbytné pro obecné typy, ale není pro šablony, protože obecné typy mohou specializované za běhu pomocí libovolné třída , splňuje omezení, když je příliš pozdě Kontrola použití neplatný členů.
Výchozí instance typu parametr mohou být vytvořeny pomocí () operátor. Příklad:
T t = T();
kde T je typ parametr obecná definice třída nebo metoda , inicializuje proměnná na výchozí hodnota.Pokud T je ref třída je nulový ukazatel; Pokud T je hodnota třída objekt je inicializován na nula.Jedná se výchozí inicializační výraz.