templates c with examples
Naučite razne aspekte predložaka na jeziku C ++.
Predlošci su jedna od najsnažnijih značajki u C ++-u. Predlošci nam pružaju kôd koji je neovisan o vrsti podataka.
Drugim riječima, pomoću predložaka možemo napisati generički kod koji radi na bilo kojoj vrsti podataka. Samo trebamo proslijediti tip podataka kao parametar. Ovaj parametar koji prenosi tip podataka naziva se i nazivom tipa.
U ovom uputstvu detaljno ćemo istražiti sve o predlošcima i različitim aspektima.
=> Kliknite ovdje za apsolutnu seriju C ++ treninga.
Što ćete naučiti:
- Što su predlošci?
- Kako koristiti predloške / implementaciju?
- typename Vs. ključna riječ class
- Instantiranje predloška i specijalizacija
- Specijalizacija predloška
- C ++ Variadic Predlošci
- Zaključak
- Preporučena literatura
Što su predlošci?
Kao što je gore spomenuto, predlošci su generički, tj. Neovisni o vrsti podataka. Predlošci se uglavnom koriste kako bi se osigurala ponovna upotrebljivost koda i fleksibilnost programa. Možemo jednostavno stvoriti jednostavnu funkciju ili klasu koja uzima tip podataka kao parametar i implementirati kod koji radi za bilo koji tip podataka.
Na primjer, ako želimo da algoritam sortiranja radi za sve numeričke tipove podataka kao i za znakovne nizove, tada ćemo samo napisati funkciju koja uzima tip podataka kao argument i implementirati tehniku sortiranja.
Tada ovisno o tipu podataka (naziv tipa) koji se prosljeđuje algoritmu za sortiranje, možemo sortirati podatke bez obzira na vrstu podataka. Na ovaj način ne treba pisati deset algoritama za deset tipova podataka.
Stoga se predlošci mogu koristiti u aplikacijama u kojima trebamo da kôd bude upotrebljiv za više vrsta podataka. Predlošci se također koriste u aplikacijama u kojima je ponovna upotreba koda od primarne važnosti.
Kako koristiti predloške / implementaciju?
Predlošci se mogu implementirati na dva načina:
- Kao predložak funkcije
- Kao predložak razreda
Predložak funkcije
Predložak funkcije je poput normalne funkcije, ali jedina je razlika dok normalna funkcija može raditi samo na jednom tipu podataka, a kôd predloška funkcije može raditi na više vrsta podataka.
Iako zapravo možemo preopteretiti normalnu funkciju za rad na različitim vrstama podataka, predlošci funkcija uvijek su korisniji jer moramo napisati jedini program koji može raditi na svim vrstama podataka.
Dalje, vidjet ćemo implementaciju predložaka funkcija.
besplatni youtube to mp3 pretvarač recenzije
Opća sintaksa predloška funkcije je:
template T function_name(T args){ …… //function body }
Ovdje je T argument predloška koji prihvaća različite vrste podataka, a klasa je ključna riječ. Umjesto klase ključne riječi možemo napisati i ‘typename’.
Kada se određeni tip podataka proslijedi u function_name, prevodilac izrađuje kopiju ove funkcije s tim tipom podataka kao argumentom i izvršava se funkcija.
Pogledajmo primjer za bolje razumijevanje predložaka funkcija.
#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< U glavnoj funkciji definiramo podatke tipa int, double i char. Funkciju nazivamo func_swap sa svakom vrstom podataka. Zatim prikazujemo zamijenjene podatke za svaku vrstu podataka.
Stoga ovo pokazuje da ne trebamo pisati tri funkcije za tri vrste podataka. Dovoljno je napisati samo jednu funkciju i pretvoriti je u funkciju predloška tako da bude neovisna o tipu podataka.
Predlošci predavanja
Kao i u predlošcima funkcija, mogli bismo imati zahtjev da imamo klasu koja je slična svim ostalim aspektima, ali samo različite vrste podataka.
U ovoj situaciji možemo imati različite klase za različite tipove podataka ili različitu implementaciju za različite tipove podataka u istoj klasi. No, ovo će učiniti naš kod glomaznim.
Najbolje rješenje za to je korištenje klase predloška. Klasa predloška također se ponaša slično predlošcima funkcija. Moramo proslijediti tip podataka kao parametar klasi dok stvaramo objekte ili pozivamo funkcije člana.
Općenita sintaksa za predložak klase je:
template class className{ ….. public: T memVar; T memFunction(T args); };
U gornjoj definiciji, T djeluje kao rezervirano mjesto za tip podataka. MemVar i memFunction javnih članova također koriste T kao rezervirano mjesto za tipove podataka.
Jednom kada je klasa predloška definirana kao gore, možemo stvoriti objekte klase kako slijedi:
className classObejct1; className classObject2; className classObject3;
Primijenimo primjer koda za demonstraciju Predloga klasa:
#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 = '< Izlaz:
Najviše 100 i 75 = 100
Najviše „A“ i „a“ = a
Gornji program implementira primjer predloška klase. Imamo klasu predloška myclass. Unutar toga imamo konstruktor koji će inicijalizirati dva člana a i b klase. Postoji još jedna funkcija člana getMaxval koja je također predložak funkcije koji vraća najviše a i b.
U glavnoj funkciji konstruiramo dva objekta, myobject of type integer i mychobject of type character. Zatim pozivamo funkciju getMaxval na svakom od ovih objekata kako bismo odredili maksimalnu vrijednost.
Imajte na umu da osim parametara tipa predloška (parametri tipa T), funkcije predloška mogu imati i uobičajene parametre poput normalnih funkcija i također zadane vrijednosti parametara.
typename Vs. ključna riječ class
Dok deklariramo klasu ili funkciju predloška, koristimo jednu od dvije ključne riječi klase ili naziva tipa. Ove dvije riječi su semantički jednake i mogu se koristiti naizmjenično.
moja sql intervju pitanja i odgovori
Ali u nekim slučajevima ove riječi ne možemo koristiti kao ekvivalentne. Na primjer, kada koristimo ovisne tipove podataka u predlošcima poput 'typedef', umjesto klase koristimo typename.
Također, ključna riječ class mora se koristiti kada moramo eksplicitno instancirati predložak.
Instantiranje predloška i specijalizacija
Predlošci su napisani na generički način, što znači da je to općenita implementacija bez obzira na vrstu podataka. Prema navedenom tipu podataka, moramo generirati konkretnu klasu za svaki tip podataka.
Na primjer, ako imamo algoritam sortiranja predloška, možemo generirati konkretnu klasu za sortiranje, drugu klasu za sortiranje itd. To se naziva instanciranje predloška.
Argumente predloška (stvarne vrste podataka) zamjenjujemo parametrima predloška u definiciji klase predloška.
Na primjer,
template class sort {};
Kad proslijedimo tip podataka, sastavljač zamjenjuje tip podataka za 'T' tako da algoritam sortiranja postaje sortiranje.
Svaki put kada koristimo klasu predloška ili funkciju, postoji potreba za primjerom kada proslijedimo određenu vrstu podataka. Ako ova instanca već nije prisutna, prevodilac kreira jedan s određenim tipom podataka. Ovo je implicitna instancija.
Jedan nedostatak implicitne instancije je taj što kompajler generira klasu instance samo za argumente koji se trenutno koriste. To znači da ako želimo generirati biblioteku instanci prije upotrebe tih instanci, moramo ići na eksplicitnu instanciju.
Primjer deklaracije predloška dan je u nastavku:
template class Array(T)
Može se eksplicitno instancirati kao:
template class Array
Kada se klasa instancira, svi njezini članovi također se instanciraju.
Specijalizacija predloška
Tijekom programiranja pomoću predložaka, mogli bismo se suočiti sa situacijom koja bi nam mogla zahtijevati posebnu implementaciju za određenu vrstu podataka. Kad se dogodi takva situacija, idemo na specijalizaciju za predložak.
U specijalizaciji predloška implementiramo posebno ponašanje za određeni tip podataka, osim izvorne definicije predloška za ostale tipove podataka.
Na primjer, uzmite u obzir da imamo klasu predloška moj priraštaj ’ koji ima konstruktor za inicijalizaciju vrijednosti i funkcije predloška naPovećanje koja vrijednost povećava za 1.
Ova će klasa savršeno raditi za sve vrste podataka, osim za char. Umjesto da povećavate vrijednost za char, zašto mu ne biste dodijelili posebno ponašanje i umjesto toga pretvorili znak u velika slova?
Da bismo to učinili, možemo ići na specijalizaciju za predložak za tip podataka char.
Ova je implementacija prikazana u donjem primjeru koda.
#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: '< Izlaz:
Povećana vrijednost int: 8
Velika vrijednost: S
Povećana dvostruka vrijednost: 12
U gornjem programu koji pokazuje specijalizaciju predloška, pogledajte način na koji smo proglasili specijalizirani predložak za tip char. Prvo deklariramo izvornu klasu, a zatim je 'specijaliziramo' za tip char. Za početak specijalizacije koristimo praznu deklaraciju predloška „predložak“.
Zatim nakon naziva klase uključujemo tip podataka. Nakon ove dvije promjene, klasa je napisana za tip char.
kako igrati predmete udarnog vala s bljeskalicom
U glavnoj funkciji imajte na umu da ne postoji razlika između instanciranja tipa char i ostalih tipova. Jedina je razlika u tome što redefiniramo specijaliziranu klasu.
Napominjemo da moramo definirati sve članove specijalizirane klase iako su potpuno isti u klasi generičkog / izvornog predloška. To je zato što nemamo značajku nasljeđivanja za članove od generičkog predloška do specijaliziranog predloška.
C ++ Variadic Predlošci
Do sada smo vidjeli predloške funkcija koji uzimaju fiksni broj argumenata. Postoje i predlošci koji uzimaju promjenjiv broj argumenata. Ti se predlošci funkcija nazivaju varijadijski predlošci. Variadni predlošci jedna su od najnovijih značajki C ++ 11.
Varijadni predlošci uzimaju promjenjiv broj argumenata koji su sigurni za tip i argumenti se rješavaju u vrijeme prevođenja.
Uzmimo cjelovit primjer programiranja da bismo to razumjeli.
#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 = '< Gornji primjer pokazuje varijadnu funkciju, 'zbrajanje'. Kao što je gore prikazano, prvo nam treba osnovna funkcija koja provodi osnovni slučaj. Tada implementiramo varijadnu funkciju na vrhu ove funkcije.
U sumiranju funkcije varijable naziva se 'typename ... args' paket parametara predloška dok se naziva 'Args ... args' paket parametara funkcije .
Nakon pisanja predloška funkcije koji implementira osnovni slučaj, napišemo varijadičnu funkciju koja implementira opći slučaj. Variadna funkcija napisana je slično rekurziji kao što je prikazano za zbrajanje (argumenti ...). Prvi argument odvojen je od paketa parametara funkcije u tip T (prvi).
Sa svakim pozivom na zbrajanje, popis parametara se sužava za jedan argument i na kraju se postiže osnovni uvjet. Izlaz prikazuje zbroj dugih cijelih brojeva i znakova.
Zaključak
Ovim završavamo ovaj tutorial o predlošcima na C ++. Predlošci nam pomažu da naše programe učinimo generičkim, tj. Neovisnim o vrsti.
Također pročitajte = >> Vodič za predložak tikvice
Generički programi uvijek stoje na vrhu ostalih programa, jer ne trebamo pisati zasebne programe za svaku vrstu podataka. Stoga razvoj generički zaštićenih programa može biti važan korak prema učinkovitom programiranju.
=> Ovdje pogledajte temeljne vodiče za obuku za C ++.
Preporučena literatura
- Vodič za glavne funkcije Pythona s praktičnim primjerima
- Kako funkcionira testiranje na temelju podataka (primjeri QTP-a i selena)
- Višenitnost u jeziku C ++ s primjerima
- Python DateTime Vodič s primjerima
- Uzorak predloška test primjera s primjerima test primjera (preuzmi)
- Izreži naredbu u Unixu s primjerima
- Uzorak predloška za izvješće o ispitivanju prihvaćanja s primjerima
- Sintaksa naredbe Unix Cat, mogućnosti s primjerima