C ++ predlošci

U ovom ćete članku naučiti o predlošcima na C ++. Naučit ćete koristiti snagu predložaka za generičko programiranje.

Predlošci su moćne značajke C ++-a koji vam omogućuje pisanje generičkih programa. Jednostavno rečeno, možete stvoriti jednu funkciju ili klasu za rad s različitim vrstama podataka pomoću predložaka.

Predlošci se često koriste u većoj bazi kodova u svrhu ponovne upotrebljivosti koda i fleksibilnosti programa.

Koncept predložaka može se koristiti na dva različita načina:

  • Predlošci funkcija
  • Predlošci predavanja

Predlošci funkcija

Predložak funkcije radi slično normalnoj funkciji, s jednom ključnom razlikom.

Predložak jedne funkcije može raditi s različitim vrstama podataka odjednom, ali jedna normalna funkcija može raditi samo s jednim skupom tipova podataka.

Ako trebate izvesti identične operacije na dvije ili više vrsta podataka, koristite preopterećenje funkcije da biste stvorili dvije funkcije s potrebnom deklaracijom funkcije.

Međutim, bolji pristup bio bi koristiti predloške funkcija jer možete izvoditi isti zadatak pišući manje održiv kôd.

Kako prijaviti predložak funkcije?

Funkciju predloška počinje s ključnom riječi predlošku slijedi predloška parametra / s unutarnje strane koja slijedi funkciju deklaracije.

 predložak < klasa T> T someFunction (T arg) (…)

U gornjem kodu T je argument predloška koji prihvaća različite vrste podataka (int, float), a klasa je ključna riječ.

typenameU gornjem primjeru možete koristiti i ključnu riječ umjesto klase.

Kada se prosljeđuje argument tipa podataka someFunction( ), sastavljač generira novu verziju someFunction()za zadani tip podataka.

Primjer 1: Predložak funkcije za pronalaženje najvećeg broja

Program za prikaz najvećeg među dva broja pomoću predloga funkcije.

 // If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )

Izlaz

Unesite dvije cijele brojke: 5 10 10 je veće. Unesite dva broja s pomičnom zarezom: 12,4 10,2 12,4 je veći. Unesite dva znaka: z Z z ima veću ASCII vrijednost.

U gornjem programu Large()definiran je predložak funkcije koji prihvaća dva argumenta n1 i n2 tipa podataka T. Toznačava da argument može biti bilo koje vrste podataka.

Large() funkcija vraća najveći među dva argumenta pomoću jednostavne uvjetne operacije.

Unutar main()funkcije, varijable tri različite vrste podataka: int, floati chardeklarirane. Tada se varijable prosljeđuju Large()predlošku funkcije kao normalne funkcije.

Tijekom vremena izvođenja, kada se cijeli broj preda funkciji predloška, ​​kompajler zna da mora generirati Large()funkciju za prihvaćanje int argumenata i to čini.

Slično tome, kada se prenose podaci s pomičnom zarezom i podaci sa znakom, on zna tipove podataka argumenata i u Large()skladu s tim generira funkciju.

Na ovaj način, upotreba samo jednog predloška funkcije zamijenila je tri identične normalne funkcije i učinila vaš kod održivim.

Primjer 2: Zamijenite podatke pomoću predloga funkcije

Program za zamjenu podataka koristeći predloške funkcija.

 #include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; ) 

Izlaz

Prije prosljeđivanja podataka u predložak funkcije. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Nakon prosljeđivanja podataka u predložak funkcije. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

U ovom programu, umjesto pozivanja funkcije prosljeđivanjem vrijednosti, izdaje se poziv referencom.

Swap()Funkcija predloška traje dva argumenta i swap ih referenca.

Predlošci predavanja

Kao i predlošci funkcija, također možete stvoriti predloške klasa za generičke operacije klase.

Ponekad vam treba implementacija klase koja je ista za sve klase, samo što se koriste tipovi podataka koji se razlikuju.

Obično biste trebali stvoriti različitu klasu za svaki tip podataka ILI stvoriti različite varijable i funkcije člana unutar jedne klase.

To će nepotrebno napuhati vašu bazu koda i bit će je teško održavati, jer je promjena jedna klasa / funkcija bi se trebala izvršiti na svim klasama / funkcijama.

Međutim, predlošci klasa olakšavaju ponovnu upotrebu istog koda za sve vrste podataka.

Kako prijaviti predložak klase?

 template < class T> class className (… public: T var; T someOperation (T arg);…);

U gornjoj je deklaraciji Targument predloška koji je rezervirano mjesto za korišteni tip podataka.

Unutar tijela klase varijabla člana var i funkcija člana someOperation()su oba tipa T.

Kako stvoriti objekt predloška klase?

Da biste stvorili objekt predloška klase, trebate definirati vrstu podataka unutar a prilikom izrade.

 className classObject; 

Na primjer:

 className classObject; className classObject; className classObject; 

Example 3: Simple calculator using Class template

Program to add, subtract, multiply and divide two numbers using class template

 #include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; ) 

Output

 Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2 

In the above program, a class template Calculator is declared.

The class contains two private members of type T: num1 & num2, and a constructor to initalize the members.

It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult() to display the final output to the screen.

In the main() function, two different Calculator objects intCalc and floatCalc are created for data types: int and float respectively. The values are initialized using the constructor.

Notice we use and while creating the objects. These tell the compiler the data type used for the class creation.

This creates a class definition each for int and float, which are then used accordingly.

Zatim displayResult()se poziva oba objekta koji izvode operacije kalkulatora i prikazuju izlaz.

Zanimljivi članci...