C++ sablonok
A C++/CLI támogatja a hagyományos C++ sablonokat pontosan úgy, ahogy a szabványos C++ is teszi: kvázi makróként.
Ez sok tekintetben rugalmasabb, mint a .NET genericjei, azonban van néhány korlátja:
- Nincs szerződés modell: hogy a paraméterként kapott típus megfelel-e, az csak a példány fordításakor derül ki. Nem írhatok elő kötelezően semmilyen
tulajdonságot a paraméterül kapott típusra nézve.
- A sablon példány csak az adott assembly-ben jön létre, méghozzá fordítási időben.
CLR sablonok a C++/CLI-ben
A .NET 2.0-ás verziójától bevezették a .NET-ben is a sablonokat, s CLR szinten implementálták őket. Ez azzal az előnnyel jár, hogy a C++ sablonhoz hasonlóan
a példányosított sablon önálló osztály, amely azonban ebben az esetben futási időben jön létre. A paraméterekre vonatkozóan számos kikötés tehető:
milyen osztály vagy interfész leszármazottja legyen, érték vagy referencia típus, stb.
A CLR sablonokat a generic kulcsszóval deklaráljuk, a feltételek megadása a where kulcsszó után lehetséges.
A C++ sablonokhoz hasonlóan létrehozhatunk sablon osztályt és sablon metódust is, sőt sablon interfészeket is definiálhatunk.
generic
where T : I
void f(T t) {
t->f1();
t->f2();
safe_cast(t)->f3();
}
Különbségek a CLR Generic-ek és a C++ template-k között:
- A generic típusokat a rendszer futásidőben példányosítja, a template-ket fordítási időben
- A CLR assembly (MSIL) szinten támogatja a generic típusokat. Mivel a futtatókörnyezet ismeri a generic fogalmát, így más assembly-kben definiált generic típusokat
is példányosíthatunk. Ezzel szemben a template definíciója "eltűnik" a fordítás során, más assembly-ben nem felhasználható.
- Két külön assembly-ben azonos paraméterekkel specializált generic ugyanazt a típust jelenti. Ezzel szemben a két különböző assembly-ben azonos paraméterekkel
specializált template két különböző típust alkot.
- A generic példányok közös futtatható kódot használnak minden referencia típusú paraméterhez - érték típusú paraméterek esetén külön implementáció generálódik.
Template-k esetén minden példány saját kódot használ.
- A generic nem paraméterezhető értékkel. A template ezt is megengedi: template C {}
- A generic esetén nincs lehetőség explicit specializációra (egyedi implementáció egy megadott típusra). A template lehetőséget ad rá.
- A generic nem ad lehetőséget arra, hogy egy paraméterként kapott típus legyen a generic típus őse.
- Generic esetén nincs lehetőség a paramétereknek alapértelmezett értéket adni.
- Egy template-nek lehetnek template-template paraméterei, pl.: template class X> class MyClass), generic esetén erre nincs lehetőség.