Részleges sablon szakosodás

A részleges sablonspecializáció  egy C++ programozási nyelvi mechanizmus , amelyet arra terveztek, hogy az általános sablonosztályokat speciális feladatokra vagy paraméterezett adattípusaik meghatározott részhalmazára specializálja [1] . Az amerikai tudós és a C++ megalkotója, B. Stroustrup szerint a sablonspecializáció hatékony eszköz a kódkötetek ellenőrizetlen növekedésének megakadályozására a sablonosztály eszközök aktív használatával, még közepes méretű szoftverprojektek fejlesztésekor is. Ennek az az oka, hogy nem teszi lehetővé az egyes adattípusokhoz redundáns kódreplikák generálását, azok általánosabb kódrészletekkel való helyettesítését, és ezen túlmenően a végtermék fordítási és összekapcsolási idejének csökkentését [2] .

Explicit teljes specializáció

A C++-ban egy paraméterezett adattípus (sablon) explicit specializálása egy további sablonosztály létrehozásával valósul meg, amelyben az elsődleges osztály bemeneti paraméterei teljesen vagy részben újradefiniálva vannak bizonyos adattípusokkal [1] [3] .

Az ilyen felülírás szintaxisa a következő [4] :

sablon < sablon osztály bemeneti paramétereinek listája > _ osztály | szerkezet | union class_name < sablon osztály argumentumlista > _ _ _

Például [1] :

// elsődleges osztály sablon < typename Window , typename Controller > class Widget { /* ... a paraméterezett Widget osztály megvalósítása bármilyen ablakhoz és bármely Controller eseménykezelőhöz */ }; // az elsődleges osztálysablon kifejezett specializációja <> osztály Widget < DialogWindow , DialogController > { /* ... a Widget osztály megvalósítása a DialogWindow párbeszédpanel és a DialogController párbeszédpanel eseménykezelővel való munkához */ };

Megjegyzendő, hogy az elsődleges osztályban található adattípus-definíciókat soha nem használják a részleges specializáció tagjainak példányosítására. Az elsődleges osztály speciális verzióinak kódmegvalósításának azonban semmi köze ehhez, és tartalmazhat olyan tagokat, amelyeknek semmi közük az elsődleges osztály tagjaihoz [4] .

A kódgenerálás szakaszában a fordító, amikor megfelelő sablont keres, részben megrendeli az elsődleges osztály szakirány számára elérhető változatait, és kiválasztja közülük a legmegfelelőbbet. Ha nincs, akkor a fordító hibaüzenetet generál [4] .

Részleges specializáció

Az osztálysablon részleges specializációja az elsődleges osztály paramétereinek bizonyos konfigurációja, amely argumentumként szolgál a speciális megvalósításhoz. Példa egy ilyen specializációra bármely konténerosztály , amely mutatóobjektumok tárolására van megvalósítva [2] [5] :

// elsődleges osztály sablon < típusnév T > osztályú vektor { /* ... konténer osztály megvalósítása T típusú objektumokhoz... */ }; // az elsődleges osztály részleges specializációja mutatók tárolására sablon < típusnév T > osztály Vektor < T *> { /* ... konténer osztály megvalósítása T típusú objektumokra mutató mutatókhoz... */ };

Ebben az esetben a sablonparaméter argumentum nem a sablonnak argumentumként átadott kifejezés, hanem a deklarált elsődleges osztálysablon [2] alapján készült argumentumkonstrukcióból származik .

Paraméterezett sablonosztály egyes metódusainak részleges szakosítása nem megengedett [1] , és részleges specializáció nem engedélyezett az alapértelmezett paraméterek használatára [5] .

Példa

A részleges sablonspecializáció rugalmas használata lehetővé teszi néhány nem triviális típusú számítás hatékony végrehajtását. Például az osztályok meglehetősen egyszerű összeállítása segíthet egy többdimenziós tömb szerkezetének (dimenzióinak számának) kiszámításában korábban ismeretlen típusú elemekkel [5] :

// elsődleges osztály sablon < class T > struct RankOfArray { static const int value = 0 ; }; // ismétlődő részlegesen specializált osztálysablon < class T , int N > struct RankOfArray < T [ N ] > { static const int value = 1 + RankOfArray < T > :: value ; };

Lásd még

Jegyzetek

  1. 1 2 3 4 Alexandrescu A. 2.2 Részleges sablonspecializáció // Modern C++ tervezés: általános programozási és tervezési minták alkalmazottak. - Addison Wesley, 2001. - P. 22-23. — 352 p. - ISBN 0-201-70431-5 .
  2. 1 2 3 Stroustrup B. 25.3 Szakterület // A C++ programozási nyelv. — 4. kiadás. - Addison-Wesley, 2013. - P. 730. - ISBN 978-0-321-56384-2 .
  3. Baumann R. 3.1 Explicit specializáció // Mély reflexió a C++ sablon mechanizmusáról. - Zürich: Swiss Federal Institute of Technology ETH, 2002. - 10. o.
  4. 1 2 3 Pobegailo A.P. 19.5 Osztálysablon részleges specializációja // C/C++ diákoknak. - BHV-Petersburg, 2006. - S. 265. - 528 p. — (Számítógépek). — ISBN 5-94157-647-1 .
  5. 1 2 3 Baumann R. 3.2 Az osztálysablon részleges specializációja // Mély reflexió a C++ sablon mechanizmusáról. - Zürich: Swiss Federal Institute of Technology ETH, 2002. - 13. o.

Linkek