Sdílet prostřednictvím


Přehled obecných typů ve Visual C++

Generické typy jsou parametrizované typy podporovaných společného jazykového modulu runtime.Parametry typ je typ, který je definován pomocí parametru neznámého typu, který je určen při použití obecného.

Proč obecných typů?

C++ podporuje obě šablony a šablony a obecné typy podporují parametrizované typy pro vytvoření typové kolekce tříd.Šablony poskytují však Parametrizace v době kompilace.Nelze odkazovat na sestavení obsahující definice šablony a vytvoření nové specializace šablony.Po kompilaci, specializované šablony vypadá stejně jako ostatní třídy nebo metody.Naopak jsou emitovány obecných typů v MSIL Parametrizovaná typ známé modulem runtime parametry typu; zdrojový kód, který odkazuje na sestavení obsahující obecný typ můžete vytvořit specializace obecného typu.Další informace o porovnávání šablony Visual C++ a obecné typy, viz Obecné typy a šablony (Visual C++).

Obecné funkce a typy

Typy tříd, tak dlouho, dokud jsou spravované typy, mohou být obecné.Příkladem tohoto může být List třídy.Typ objektu v seznamu bude parametr typu.Pokud byste potřebovali List třídy pro různé druhy objektů před obecné typy, které jste použili List , která má System::Object jako typ položky.Ale, by umožnilo má být použit v seznamu všech objektů (včetně objektů chybný typ).Tento seznam by volána třídou bez udaného typu kolekce.Jste nejlepší, kontrola typu v době běhu a vyvolat výjimku.Nebo jste použili šablonu, která ztratí své obecné kvality jednou zkompilován do sestavení.Spotřebitelé vaše sestavení nelze vytvořit vlastní specializace šablony.Obecné typy umožňují vytvořit typové kolekce tříd, Řekněme List<int> (Číst jako seznam"int") a List<double> ("seznam double") který vygeneruje chybu v době kompilace, pokud jste se pokusili vložit typ kolekce byla navržena pro přijetí do typovou kolekci.Navíc zůstávají tyto typy obecných po kompilaci jsou.

Popis syntaxe obecné třídy lze nalézt v Obecné třídy (C++/CLI). nový obor názvů System.Collections.Generic, představuje sadu typů kolekce parametry včetně Dictionary, List a LinkedList.Další informace naleznete v tématu Obecné typy v knihovně tříd rozhraní .NET Framework (Průvodce programováním v C#).

Obě instance a členské funkce statické třídy, delegátů a globální funkce mohou být také obecný.Obecné funkce může být nezbytné, pokud jsou parametry funkce neznámého typu nebo samotnou funkci musí pracovat s obecnými typy.V mnoha případech kde System::Object byl použit v minulosti jako parametr pro typ objektu Neznámý parametr obecného typu mohou být použity místo, umožňující další kód zajišťující bezpečnost typů.Jakýkoli pokus o předání v typu funkce nebyl navržen pro bude označena jako chyba při kompilaci.Pomocí System::Object jako parametr funkce, neúmyslné předáním objektu nebylo zjištěno, že funkce není určen k řešení a je třeba přetypovat Neznámý typ objektu pro konkrétní typ v těle funkce a účet pro možnost k InvalidCastException.S obecnou kód pokusí předat funkci objektu způsobí konflikt typu tak je zaručeno, že tělo funkce mít správný typ.

Použít stejné výhody kolekce tříd, které jsou založeny na obecných typů.Použijte třídy kolekcí v minulosti System::Object k uložení prvků v kolekci.Vložení objektů typu kolekce nebyl navržen pro nebyl označen v době kompilace a často dokonce ani v případě, že objekty byly vloženy.Objekt by obvykle přetypovat na jiný typ, pokud bylo přistupováno v kolekci.Pouze v případě, že se nezdařilo tavby by neočekávaný typ rozpoznat.Obecné typy tento problém řeší v době kompilace jakýkoli kód, který vloží na typ, který nebude odpovídat (nebo implicitně převést) po zjištění parametr typu obecné kolekce.

Popis syntaxe naleznete v tématu Obecné funkce (C++/CLI).

Terminologie s obecných typů

Parametry typu

Obecné prohlášení obsahuje jednu nebo více neznámé typy, které jsou známé jako parametry typu.Název, který zastupuje typ v těle obecné prohlášení jsou uvedeny parametry typu.Typ parametru se používá jako typ v těle obecné prohlášení.Obecné prohlášení pro seznam<T> obsahuje parametr typu T.

Argumenty typu

Argumentu typ je skutečný typ použít místo parametr typu obecného se specializuje na určitý typ nebo typy.Například int je typ argumentu v List<int>.Typy hodnot a zpracování jsou pouze typy povolených v jako obecný typ argumentů.

Konstruovaný typ

Typ zhotoveny z obecného typu, jsou označovány jako konstruovaný typ.Typ je určen úplně, jako List<T> se Otevřít konstruovaný typ; Typ je plně určen, jako List<double>, je uzavřeného typu vyrobeno nebo speciální typ.Otevřít konstruované typy mohou být použity jiné obecné typy a metody do definice a nesmí být plně určen, dokud orámování obecný je určen.Následující příklad je použití otevřených konstruovaný typ jako základní třída pro obecnou:

// 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í na typy, které lze použít jako parametr typu.Uvedené obecné třídy může například přijímat pouze pro třídy, které dědí z třídy zadané nebo implementují zadané rozhraní.Další informace naleznete v tématu Omezení parametrů obecných typů (C++/CLI).

Referenční typy a hodnoty

Úchyty pro typy a hodnoty mohou sloužit jako argumenty typu.Obecná definice, ve kterém lze použít typ, syntaxe, je referenční typy.Například –> operátor se používá pro přístup k členům typ parametru typu, zda je typ nakonec použit typ odkazu nebo typ hodnoty.Pokud je typ hodnoty slouží jako argument typu, modul runtime generuje kód, který používá typy hodnot přímo bez zabalení typů hodnot.

Při použití typu odkazu jako argument obecného typu, použijte syntaxi úchyt.Pokud použijete typ hodnoty 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, do generické třídy jsou zpracovávána jako jiné identifikátory.Protože typ není znám, existují však omezení jejich použití.Nelze například použít členy a metody třídy type parametr, pokud parametr typu je znám pro podporu těchto členů.To znamená, že přístup k členu pomocí parametru typu, je nutné přidat typ, který obsahuje člen do seznamu omezení parametru typu.

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

Tato omezení platí i hospodářským subjektům.Parametr obecného typu bez omezení nelze použít == a != hospodářské subjekty, aby v případě, že typ nepodporuje tyto operátory porovnání dvou instancí parametru typu.Tyto kontroly jsou nezbytné pro obecné typy, ale není pro šablony, protože obecné typy mohou specializované za běhu pomocí libovolné třídy, která splňuje omezení, kdy je příliš pozdě pro kontrolu použití neplatných členů.

Výchozí instanci parametru typu mohou být vytvořeny pomocí () operátor.Příklad:

T t = T();

kde T je parametr typu v definici obecného třídy nebo metody, inicializuje proměnnou na výchozí hodnotu.Pokud T je třída ref je ukazatel s hodnotou null; Pokud T je hodnota třída, objekt je inicializován nula.Jedná se inicializátor výchozí.

Viz také

Další zdroje

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