Ц ++ предлошци

У овом чланку ћете сазнати о предлошцима на језику Ц ++. Научићете да користите снагу шаблона за генеричко програмирање.

Предлошци су моћне карактеристике Ц ++-а који вам омогућава писање генеричких програма. Једноставно речено, можете креирати једну функцију или класу за рад са различитим типовима података помоћу шаблона.

Предлошци се често користе у већој кодној бази у сврху поновне употребљивости кода и флексибилности програма.

Концепт шаблона може се користити на два различита начина:

  • Предлошци функција
  • Предлошци предавања

Предлошци функција

Предложак функције ради слично нормалној функцији, са једном кључном разликом.

Предложак једне функције може радити са различитим типовима података одједном, али једна нормална функција може радити само са једним скупом типова података.

Ако требате да извршите идентичне операције на две или више врста података, обично користите преоптерећење функције да бисте креирали две функције са потребном декларацијом функције.

Међутим, бољи приступ био би коришћење шаблона функција, јер можете обавити исти задатак писањем мање одрживог кода.

Како се декларише шаблон функције?

А функција темплате почиње са кључних речи шаблон затим изнутра темплате параметар / с што је праћено декларацијом функција.

 темплате < цласс Т> Т сомеФунцтион (Т арг) (…)

У горњем коду, Т је аргумент шаблона који прихвата различите типове података (инт, флоат), а класа је кључна реч.

Такође можете да користите кључну реч typenameуместо класе у горњем примеру.

Када се проследи аргумент типа података someFunction( ), преводилац генерише нову верзију someFunction()за дати тип података.

Пример 1: Предложак функције за проналажење највећег броја

Програм за приказ највећег међу два броја помоћу шаблона функција.

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

Оутпут

Унесите две целобројне вредности: 5 10 10 је веће. Унесите два броја с помичном зарезом: 12,4 10,2 12,4 је већи. Унесите два знака: з З з има већу АСЦИИ вредност.

У горњем програму Large()је дефинисан шаблон функције који прихвата два аргумента н1 и н2 типа података T. Tозначава да аргумент може бити било ког типа података.

Large() функција враћа највећи међу два аргумента користећи једноставну условну операцију.

Унутар main()функције, променљиве три различите врсте података: int, floatи charсу проглашени. Затим се променљиве прослеђују Large()предлошку функције као нормалне функције.

Током извођења, када се цели број проследи функцији предлошка, компајлер зна да мора генерисати Large()функцију за прихватање инт аргумената и то чини.

Слично томе, када се преносе подаци са помичном тачком и подаци са знаком, он зна типове података аргумената и генерише Large()функцију у складу с тим.

На овај начин, употреба само једног шаблона функције заменила је три идентичне нормалне функције и учинила ваш код одрживим.

Пример 2: Замените податке помоћу шаблона функција

Програм за размену података помоћу шаблона функција.

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

Оутпут

Пре прослеђивања података у образац функције. и1 = 1 и2 = 2 ф1 = 1,1 ф2 = 2,2 ц1 = а ц2 = б Након прослеђивања података у образац функције. и1 = 2 и2 = 1 ф1 = 2,2 ф2 = 1,1 ц1 = б ц2 = а

У овом програму, уместо позива функције преношењем вредности, издаје се позив референцом.

Предложак Swap()функције узима два аргумента и замењује их референцом.

Предлошци предавања

Као и предлошци функција, такође можете креирати предлошке класа за генеричке операције класе.

Понекад вам је потребна имплементација класе која је иста за све класе, само што се користе типови података који се разликују.

Уобичајено је да морате створити другачију класу за сваки тип података ИЛИ креирати различите чланске променљиве и функције у оквиру једне класе.

Ово ће непотребно надувати вашу базу кода и биће је тешко одржавати, јер је промена једна класа / функција треба да се изврши на свим класама / функцијама.

Међутим, предлошци класа олакшавају поновну употребу истог кода за све типове података.

Како прогласити предложак класе?

 темплате < цласс Т> цласс цлассНаме (… публиц: Т вар; Т сомеОператион (Т арг);…);

У горњој декларацији Tје аргумент предлошка који је резервирано место за тип података који се користи.

Унутар тела класе променљива члана вар и функција члана someOperation()су типа T.

Како створити објект предлошка класе?

Да бисте креирали објект предлошка класе, треба да дефинишете тип података унутар а приликом креирања.

 цлассНаме цлассОбјецт; 

На пример:

цлассНаме цлассОбјецт; цлассНаме цлассОбјецт; цлассНаме цлассОбјецт;

Пример 3: Једноставни калкулатор који користи предложак класе

Програм за сабирање, одузимање, множење и дељење два броја помоћу предлошка класе

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

Оутпут

Инт резултати: Бројеви су: 2 и 1. Сабирање је: 3 Одузимање је: 1 Производ је: 2 Дељење је: 2 Резултати са бројем: Бројеви су: 2.4 и 1.2. Сабирање је: 3.6 Одузимање је: 1.2 Производ је: 2.88 Дељење је: 2

У горњем програму Calculatorје декларисан предложак класе .

Класа садржи два приватна члана типа T: нум1 & нум2 и конструктор који иницира чланове.

Такође садржи функције јавног члана за израчунавање сабирања, одузимања, множења и дељења бројева који враћају вредност типа података који је дефинисао корисник. Такође, функција displayResult()за приказ коначног излаза на екрану.

У main()функцији се креирају два различита Calculatorобјекта intCalcи floatCalcза типове података: intи floatреспективно. Вредности се иницијализују помоћу конструктора.

Приметимо да користимо и приликом стварања предмета. Они компајлеру кажу тип података који се користи за креирање класе.

Ово ствара дефиницију класе за intи float, које се затим користе у складу с тим.

Затим displayResult()се позива оба објекта који изводе операције калкулатора и приказују излаз.

Занимљиви Чланци...