templates c with examples
Naučte se různé aspekty šablon v C ++.
Šablony jsou jednou z nejvýkonnějších funkcí v C ++. Šablony nám poskytují kód, který je nezávislý na datovém typu.
Jinými slovy, pomocí šablon můžeme napsat obecný kód, který funguje na jakémkoli datovém typu. Musíme pouze předat datový typ jako parametr. Tento parametr, který předává datový typ, se také nazývá název typu.
V tomto tutoriálu podrobně prozkoumáme všechny šablony a jejich různé aspekty.
=> Klikněte sem a získejte Absolute C ++ Training Series.
Co se naučíte:
- Co jsou šablony?
- Jak používat šablony / implementaci?
- typové jméno vs. klíčové slovo třídy
- Instance instance a specializace šablony
- Specializace šablony
- C ++ Variadic šablony
- Závěr
- Doporučené čtení
Co jsou šablony?
Jak již bylo zmíněno výše, šablony jsou obecné, tj. Nezávislé na datovém typu. Šablony se používají hlavně k zajištění opětovného použití kódu a flexibility programů. Můžeme jen vytvořit jednoduchou funkci nebo třídu, která bere datový typ jako parametr a implementovat kód, který funguje pro jakýkoli datový typ.
Například, pokud chceme, aby třídicí algoritmus fungoval pro všechny číselné datové typy i pro znakové řetězce, napíšeme jen funkci, která vezme datový typ jako argument a implementujeme techniku třídění.
Pak v závislosti na datovém typu (název typu), který je předán algoritmu řazení, můžeme nechat data třídit bez ohledu na datový typ. Tímto způsobem nemusíme psát deset algoritmů pro deset datových typů.
Šablony lze tedy použít v aplikacích, kde požadujeme, aby byl kód použitelný pro více než jeden datový typ. Šablony se také používají v aplikacích, kde má zásadní význam opětovné použití kódu.
Jak používat šablony / implementaci?
Šablony lze implementovat dvěma způsoby:
- Jako funkční šablona
- Jako šablona třídy
Šablona funkcí
Šablona funkce je jako normální funkce, ale jediný rozdíl spočívá v tom, že normální funkce může fungovat pouze na jednom datovém typu a kód šablony funkce může fungovat na více datových typech.
I když můžeme skutečně přetížit normální funkci, abychom mohli pracovat na různých datových typech, šablony funkcí jsou vždy užitečnější, protože musíme napsat jediný program a ten může fungovat na všech datových typech.
Dále uvidíme implementaci šablon funkcí.
Obecná syntaxe šablony funkce je:
template T function_name(T args){ …… //function body }
Tady je T argument šablony, který přijímá různé datové typy a třída je klíčové slovo. Místo třídy klíčových slov můžeme napsat také „typename“.
Když je konkrétní datový typ předán function_name, kopii této funkce vytvoří kompilátor s tímto datovým typem jako argument a funkce.
Podívejme se na příklad, abychom lépe porozuměli funkčním šablonám.
#include using namespace std; template void func_swap(T &arg1, T &arg2) { T temp; temp = arg1; arg1 = arg2; arg2 = temp; } int main() { int num1 = 10, num2 = 20; double d1 = 100.53, d2 = 435.54; char ch1 = 'A', ch2 = 'Z'; cout << 'Original data
'; cout << 'num1 = ' << num1 << ' num2 = ' << num2<Šablony tříd Stejně jako v šablonách funkcí můžeme mít požadavek mít třídu podobnou všem ostatním aspektům, ale pouze různé datové typy.
V této situaci můžeme mít různé třídy pro různé datové typy nebo jinou implementaci pro různé datové typy ve stejné třídě. Díky tomu však bude náš kód objemný.
Nejlepším řešením je použít třídu šablony. Třída šablon se také chová podobně jako šablony funkcí. Při vytváření objektů nebo při volání členských funkcí musíme předat datový typ jako parametr třídě.
nejlepší bezplatná aplikace pro stahování hudby z mp3 pro Android
Obecná syntaxe pro šablonu třídy je:
template class className{ ….. public: T memVar; T memFunction(T args); };
Ve výše uvedené definici funguje T jako zástupný symbol pro datový typ. MemVar a memFunction veřejných členů také používají T jako zástupný symbol pro datové typy.
Jakmile je třída šablony definována výše, můžeme vytvářet objekty třídy takto:
className classObejct1; className classObject2; className classObject3;
Implementujme příklad kódu k předvedení šablon tříd:
#include using namespace std; template class myclass { T a, b; public: myclass (T first, T second) {a=first; b=second;} T getMaxval (); }; template T myclass::getMaxval () { return (a>b? a : b); } int main () { myclass myobject (100, 75); cout<<'Maximum of 100 and 75 = '< Výstup:
Maximálně 100 a 75 = 100
Maximum „A“ a „a“ = a
Výše uvedený program implementuje příklad šablony třídy. Máme třídu šablony myclass. Uvnitř toho máme konstruktor, který inicializuje dva členy a a b třídy. Existuje další členská funkce getMaxval, která je také šablonou funkce, která vrací maximálně aab.
V hlavní funkci konstruujeme dva objekty, myobject typu integer a mychobject typu charakter. Potom zavoláme funkci getMaxval na každém z těchto objektů, abychom určili maximální hodnotu.
Všimněte si, že kromě parametrů typu šablony (parametry typu T) mohou mít funkce šablony také běžné parametry, jako jsou normální funkce, a také výchozí hodnoty parametrů.
typové jméno vs. klíčové slovo třídy
Při deklaraci třídy nebo funkce šablony používáme jedno ze dvou klíčových slov třídy nebo typename. Tato dvě slova jsou sémanticky ekvivalentní a lze je použít zaměnitelně.
V některých případech však nemůžeme tato slova použít jako ekvivalentní. Například, když používáme závislé datové typy v šablonách jako „typedef“, použijeme místo třídy typename.
Také musíme použít klíčové slovo třídy, když musíme explicitně vytvořit instanci šablony.
Instance instance a specializace šablony
Šablony jsou psány obecně, což znamená, že jde o obecnou implementaci bez ohledu na datový typ. Podle poskytnutého datového typu musíme pro každý datový typ vygenerovat konkrétní třídu.
Například, pokud máme algoritmus třídění šablon, můžeme vygenerovat konkrétní třídu pro třídění, jinou třídu pro třídění atd. Tomu se říká vytvoření instance šablony.
V definici třídy šablony nahradíme argumenty šablony (skutečné datové typy) parametry šablony.
Například,
template class sort {};
Když předáme datový typ, kompilátor nahradí datový typ za „T“, takže se třídicí algoritmus stane tříděním.
stáhnout všechny skladby z youtube playlistu
Pokaždé, když použijeme třídu šablony nebo funkci šablony, je potřeba instance, když předáme určitý datový typ. Pokud tato instance již není k dispozici, vytvoří kompilátor jednu s konkrétním datovým typem. Toto je implicitní instance.
Jednou nevýhodou implicitní instance je, že kompilátor generuje třídu instance pouze pro argumenty, které se aktuálně používají. To znamená, že pokud chceme vygenerovat knihovnu instancí před použitím těchto instancí, musíme jít na explicitní instanci.
Níže je uveden příklad deklarace šablony:
template class Array(T)
Lze explicitně vytvořit instanci jako:
template class Array
Když je vytvořena instance třídy, jsou vytvořeny také instance všech jejích členů.
Specializace šablony
Při programování pomocí šablon bychom se mohli potýkat se situací, kdy bychom mohli vyžadovat speciální implementaci pro konkrétní datový typ. Když nastane taková situace, přejdeme na specializaci šablon.
Ve specializaci šablon implementujeme speciální chování pro konkrétní datový typ kromě původní definice šablony pro ostatní datové typy.
Například, zvažte, že máme třídu šablon ‘ myIncrement “ který má konstruktor pro inicializaci hodnoty a funkci šablony k přírůstku která zvýší hodnotu o 1.
Tato konkrétní třída bude perfektně fungovat pro všechny datové typy kromě char. Místo toho, abyste zvyšovali hodnotu char, proč mu nedat zvláštní chování a místo toho převést znak na velká písmena?
Abychom to mohli udělat, můžeme přejít na specializaci šablony pro datový typ char.
Tato implementace je uvedena v příkladu níže uvedeného kódu.
#include using namespace std; // class template: template class myIncrement { T value; public: myIncrement (T arg) {value=arg;} T toIncrement () {return ++value;} }; // class template specialization: template class myIncrement { char value; public: myIncrement (char arg) {value=arg;} char uppercase () { if ((value>='a')&&(value<='z')) value+='A'-'a'; return value; } }; int main () { myIncrement myint (7); myIncrement mychar ('s'); myIncrement mydouble(11.0); cout<<'Incremented int value: '<< myint.toIncrement()<< endl; cout<<'Uppercase value: '< Výstup:
Zvýšená hodnota int: 8
Velká hodnota: S
Zvýšená dvojnásobná hodnota: 12
Ve výše uvedeném programu, který ukazuje specializaci šablony, se podívejte na způsob, jakým jsme deklarovali specializovanou šablonu pro typ char. Nejprve deklarujeme původní třídu a poté ji „specializujeme“ na typ char. K zahájení specializace používáme prázdnou deklaraci šablony „template“.
Poté za název třídy zahrneme datový typ. Po těchto dvou změnách je třída zapsána pro typ char.
V hlavní funkci si všimněte, že není žádný rozdíl mezi instancí typu char a jinými typy. Jediný rozdíl je v tom, že předefinujeme specializovanou třídu.
Všimněte si, že musíme definovat všechny členy specializované třídy, i když jsou ve třídě obecných / původních šablon přesně stejné. Je to proto, že pro členy nemáme funkci dědičnosti od obecné šablony po specializovanou šablonu.
C ++ Variadic šablony
Zatím jsme viděli šablony funkcí, které vyžadují pevný počet argumentů. Existují také šablony, které berou proměnlivý počet argumentů. Tyto šablony funkcí se nazývají variadické šablony. Variadic šablony jsou jednou z nejnovějších funkcí C ++ 11.
Variadic šablony berou proměnlivý počet argumentů, které jsou bezpečné pro typ a argumenty jsou vyřešeny v době kompilace.
Vezměme si kompletní programovací příklad, abychom tomu porozuměli.
#include #include using namespace std; template T summation(T val) { return val; } template T summation(T first, Args... args) { return first + summation(args...); } int main() { long sum = summation(1, 2, 3, 8, 7); cout<<'Sum of long numbers = '< Výše uvedený příklad ukazuje variadickou funkci „součet“. Jak je uvedeno výše, nejprve potřebujeme základní funkci, která implementuje základní případ. Poté implementujeme funkci variadic nad tuto funkci.
V součtu proměnných funkcí se nazývá „typename… args“ balíček parametrů šablony vzhledem k tomu, že se nazývá „Args… args“ balíček funkčních parametrů .
Po napsání šablony funkce, která implementuje základní případ, napíšeme variadickou funkci, která implementuje obecný případ. Funkce variadic je zapsána podobně jako rekurze, jak je znázorněno pro součet (args…). První argument je oddělen od sady parametrů funkcí do typu T (první).
S každým voláním součtu se seznam parametrů zužuje o jeden argument a nakonec je dosaženo základní podmínky. Výstup ukazuje součet dlouhých celých čísel a znaků.
Závěr
Tímto ukončíme tento tutoriál o šablonách v C ++. Šablony nám pomáhají vytvářet naše programy obecné, tj. Nezávislé na typu.
Přečtěte si také = >> Výukový program pro šablony baňky
Obecné programy vždy stojí nad ostatními programy, protože nemusíme psát samostatné programy pro každý datový typ. Vývoj obecných programů bezpečných pro typ může být tedy důležitým krokem k efektivnímu programování.
=> Podívejte se na výukové návody do hloubky C ++ zde.
Doporučené čtení
- Výukový program pro hlavní funkce Pythonu s praktickými příklady
- Jak funguje testování založené na datech (příklady QTP a selenu)
- Vícevláknové zpracování v C ++ s příklady
- Výukový program Python DateTime s příklady
- Ukázková šablona testovacího případu s příklady testovacích případů (Stáhnout)
- Vyjmout příkaz v Unixu s příklady
- Ukázková šablona pro protokol o přejímce s příklady
- Syntaxe příkazů Unix Cat, možnosti s příklady