C ++ šablonai

Šiame straipsnyje sužinosite apie šablonus C ++. Jūs išmoksite naudoti šablonų galią bendram programavimui.

Šablonai yra galingos „C ++“ funkcijos, leidžiančios rašyti bendras programas. Paprasčiau tariant, galite sukurti vieną funkciją arba klasę, kad galėtumėte dirbti su skirtingais duomenų tipais naudodami šablonus.

Šablonai dažnai naudojami didesnėje kodų bazėje siekiant pakartotinio kodo naudojimo ir programų lankstumo.

Šablonų sąvoka gali būti naudojama dviem būdais:

  • Funkcijų šablonai
  • Klasės šablonai

Funkcijų šablonai

Funkcijos šablonas veikia panašiai kaip įprasta funkcija, turint vieną pagrindinį skirtumą.

Vienas funkcijos šablonas vienu metu gali dirbti su skirtingais duomenų tipais, tačiau viena įprasta funkcija gali veikti tik su vienu duomenų tipų rinkiniu.

Paprastai, jei jums reikia atlikti identiškas operacijas su dviem ar daugiau duomenų tipų, naudojate funkcijų perkrovą, kad sukurtumėte dvi funkcijas su reikiama funkcijų deklaracija.

Tačiau geresnis būdas būtų naudoti funkcijų šablonus, nes tą pačią užduotį galite atlikti rašydami mažiau ir prižiūrimo kodo.

Kaip deklaruoti funkcijos šabloną?

Funkcijos šablonas prasideda raktinio žodžio šablonu, po kurio yra šablono parametras (-ai) , po kurio pateikiama funkcijos deklaracija.

 šablonas < klasė T> T someFunction (T arg) (…)

Pirmiau pateiktame kode T yra šablono argumentas, kuris priima skirtingus duomenų tipus (int, float), o klasė yra raktinis žodis.

typenameAnksčiau pateiktame pavyzdyje vietoj klasės taip pat galite naudoti raktinį žodį .

Kai duomenų tipo argumentas perduodamas someFunction( ), kompiliatorius sugeneruoja naują someFunction()nurodyto tipo duomenų versiją .

1 pavyzdys: Funkcijos šablonas, skirtas rasti didžiausią skaičių

Programa rodyti didžiausią tarp dviejų skaičių naudojant funkcijų šablonus.

 // 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; )

Rezultatas

Įveskite du skaičius: 5 10 10 yra didesnis. Įveskite du slankiojo kablelio skaičius: 12,4 10,2 12,4 yra didesnis. Įveskite du simbolius: z Z z turi didesnę ASCII reikšmę.

Pirmiau pateiktoje programoje Large()yra apibrėžtas funkcijos šablonas, kuris priima du duomenų tipo argumentus n1 ir n2 T. Treiškia, kad argumentas gali būti bet kokio tipo.

Large() funkcija grąžina didžiausią iš dviejų argumentų naudodama paprastą sąlyginę operaciją.

Viduje main()funkcija, kintamieji iš trijų skirtingų duomenų tipų: int, floatir charyra deklaruoti. Tada kintamieji perduodami Large()funkcijų šablonui kaip įprastos funkcijos.

Vykdymo metu, kai šablono funkcijai perduodamas sveikas skaičius, kompiliatorius žino, kad jis turi sugeneruoti Large()funkciją, kad priimtų argumentus int, ir tai daro.

Panašiai, kai perduodami slankiojo kablelio ir char duomenys, ji žino argumentų duomenų tipus ir atitinkamai sukuria Large()funkciją.

Tokiu būdu naudojant tik vieną funkcijų šabloną buvo pakeistos trys identiškos įprastos funkcijos ir jūsų kodas tapo prižiūrimas.

2 pavyzdys: keiskite duomenis naudodami funkcijų šablonus

Programa keistis duomenimis naudojant funkcijų šablonus.

 #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; ) 

Rezultatas

Prieš perduodant duomenis į funkcijų šabloną. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Perdavus duomenis funkcijos šablonui. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

Šioje programoje, užuot iškvietus funkciją perduodant reikšmę, yra iškviečiamas nuoroda.

Swap()Funkcija šablonas trunka du argumentus ir apsikeitimo jais nuoroda.

Klasės šablonai

Kaip ir funkcijų šablonai, taip pat galite sukurti klasės šablonus bendrosioms klasės operacijoms.

Kartais jums reikia klasės, kuri būtų vienoda visoms klasėms, skiriasi tik naudojami duomenų tipai.

Paprastai kiekvienam duomenų tipui turėtumėte sukurti skirtingą klasę ARBA sukurti skirtingų narių kintamuosius ir funkcijas vienoje klasėje.

Tai be reikalo išpūs jūsų kodo bazę ir ją bus sunku prižiūrėti, nes pakeitimas yra viena klasė / funkcija, kurią reikia atlikti visose klasėse / funkcijose.

Tačiau klasės šablonai leidžia lengvai pakartotinai naudoti tą patį kodą visiems duomenų tipams.

Kaip deklaruoti klasės šabloną?

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

Pirmiau pateiktoje deklaracijoje Tyra šablono argumentas, kuris yra naudojamo duomenų tipo vietos rezervavimo ženklas.

Klasės korpuse nario kintamasis var ir nario funkcija someOperation()yra vieno tipo T.

Kaip sukurti klasės šablono objektą?

Norėdami sukurti klasės šablono objektą, kurdami turite apibrėžti duomenų tipą .

 className classObject; 

Pavyzdžiui:

 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.

Tada displayResult()iškviečiami abu objektai, kurie atlieka skaičiuoklės operacijas ir rodo išvestį.

Įdomios straipsniai...