Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Vnitřní typy u parametrů šablon, vnořené šablony v C++
25. září 2001, 00.00 | V dnešním článku se budeme věnovat dvěma nesouvisejícím tématům. Jednak vnitřním typům u parametrů šablon, s čímž souvisí pro nás nové klíčové slovo typename. Druhé téma budou vnořené šablony, tedy šablony, ve kterých je deklarována další šablona.
V dnešním článku se budeme věnovat dvěma nesouvisejícím tématům. Prvním z nich bude práce s vnitřními typy u parametrů šablon, s čímž souvisí pro nás nové klíčové slovo typename. Jako druhé téma jsem vybral vnořené šablony, tedy šablony, ve kterých je deklarována další šablona.
Vnitřní typy u parametrů šablon v C++V jazyce C++ může být v jednom typu deklarován typ jiný - vnitřní (vnořený) typ. Vnitřní typ může být jednak třída deklarovaná uvnitř třídy, nebo typ uvnitř třídy deklarovaný pomocí klíčového slova typedef. Opět, jako vždy ve svých článcích, se zabývám pouze třídou, vše co zde napíši je obdobně použitelné i pro struktury a unie. Má-li být schopen s vnitřním typem pracovat kdokoliv jiný, než objekt dané třídy, musí být vnitřní typ veřejný. Uveďme si jednoduchý příklad vnitřní třídy:
|
Nyní pro ukázku jak s vnitřní třídou pracovat předvedu velice jednoduchou funkci main.
|
Nyní se vraťme zpět k šablonám. Představme si situaci, kdy chceme vytvořit šablonu, která by jako svůj parametr měla typ. Předpokládali by jsme, že za parametr dosadíme vždy třídu, která bude mít vnitřní typ pojmenovaný jako VnitřníTřída. Tedy například naší třídu. Překladač ale v době kdy "si prohlíží" šablonu neví, že parametr možná bude mít vnitřní třídu. Proto musíme použít klíčové slovo typename. Uveďme si jednoduchý příklad.
|
Celý můj příklad je pouze ukázka použití typename. Jinak nedává žádný smysl. Snad jsem tím nikoho nezmátl. Vytvořil jsem šablonu funkce. Parametrem šablony je typ jménem Typ. Parametry funkce (parametry instance šablony) jsou výstupní proud a instance typu Typ. O typu Typ vím, že má vnitřní typ jménem VnitřníTřída. Bude-li šablona instanciována s parametrem, který nemá jako veřejný vnitřní typ se jménem VnitřníTřída, dojde k chybě. V praxi může existovat hodně tříd, které budou mít vnitřní třídu s názvem VnitřníTřída. Každá VnitřníTřída bude ale úplně jiná, bude mít jen stejně pojmenované metody, které ale mohou dělat úplně jinou činnost. Díky toho lze vytvářet velmi abstraktní šablony. Například až se budeme věnovat knihovně STL a datovým kontejnerům v C++ uvidíme, že každý kontejner má vnitřní typ jménem iterátor. Nyní ještě použití naší šablony.
|
Vnořené šablony
Nyní se podíváme na situaci, kdy v šabloně je deklarována šablona. Vytvořme si velice jednoduchou šablonu třídy, podobnou šabloně Obal z mého minulého článku. Tato třída bude mít přetížen operátor = jako svou metodu. Budeme ale chtít, aby náš operátor byl použitelný pro mnoho typů, které nemusíme v době psaní naší šablony ani znát.
|
Vytvořili jsme šablonu Obal. Šablona má jednu vnořenou šablonu - operátor =. Nyní vytvoříme implementaci tohoto operátoru.
|
Jak jsem již upozornil ve zdrojovém textu, nelze napsat template<class Typ, class Parametr> , protože by se nejednalo o vnořenou šablonu, ale o šablonu s dvěma parametry. Nyní si ukážeme použití naší šablony.
|
Pro náš obal může být parametrem operátoru = cokoliv, co lze přiřadit pomocí operátoru = (implicitního, nebo přetíženého) k jeho atributu.
Pro dnešek je to všechno. V příštím článku se pokusíme vytvořit celkem i praktickou šablonu. Bude to asi i první zdrojový text v mém seriále, který bude mít snad i nějaké praktické využití. Pokusíme se totiž vytvořit pole, které nebude mít dolní index 0, ale libovolnou programátorem zadanou hodnotu. Například indexovat jej bude možné od -10 do +10, nebo od 50 do 100. Bude se jednat o pole, jaké známe například z programovacího jazyka Pascal. V dalších článcích se potom začneme věnovat knihovně STL.
Obsah seriálu (více o seriálu):
- Základy OOP v C++: Od C k C++
- Základní pojmy objektově orientovaného programování
- Vytváření tříd, instance třídy, zasílání zpráv v C++
- Vytváření instancí - konstruktory, destruktory
- Kopírovací konstruktor v C++
- Jednoduchá dědičnost v C++
- Časná versus pozdní vazba - úvod do polymorfismu v C++
- Polymorfismus - dokončení
- Vícenásobná dědičnost v C++
- Vícenásobná dědičnost v C++ - opakovaná dědičnost
- Vícenásobná dědičnost v C++ - volání konstruktorů a destruktorů
- Přetěžování operátorů v C++ 1.díl
- Přetěžování operátorů v C++ 2. díl
- Vstupní a výstupní operace pomocí datových proudů v C++
- Přetěžování operátorů << a >> pro datové proudy v C++
- Neformátovaný vstup a výstup v C++
- Paměťové proudy v C++
- Prostory jmen v C++
- Řetězce v C++
- Výjimky v C++
- Výjimky v C++ - výjimky tvoří dědičnou hierarchii
- Výjimky v C++ - dokončení
- Dynamická identifikace typů v C++
- Přetypování v C++
- Problémy s typy při vícenásobné dědičnosti
- Šablony funkcí v C++
- Šablony datových typů v C++
- Vnitřní typy u parametrů šablon, vnořené šablony v C++
- Pole s libovolným intervalem indexování v C++
- Datové kontejnery v C++ - Úvod do STL
- Vector - datový kontejner v C++
- Iterátory v C++
- Šablona vector v C++ a iterátory
- Asociativní pole v C++
- Množina v C++
- Funkční objekty v C++
- Standardní funkční objekty v C++
- Úvod do standardních algoritmů v C++
- Kopírovací a přesouvací algoritmy v C++
- Vyhledávací algoritmy v C++
- Skenovací (prohlížecí) algoritmy v C++
- Transformační algoritmy v C++
- Řadící algoritmy v C++
- Halda v C++
- Standardní algoritmy v C++ - dokončení
- Automatické ukazatele v C++
- Inteligentní ukazatel - čítač referencí v C++
- Použití čítače referencí v C++
- Kopírování velkých objektů v C++
- Řízené kopírování prvků v poli v C++
- Dokončení seriálu objektově orientované programování v C++
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007