C ++ шаблони

В тази статия ще научите за шаблоните в C ++. Ще се научите да използвате силата на шаблоните за общо програмиране.

Шаблоните са мощни функции на C ++, който ви позволява да пишете общи програми. С прости думи, можете да създадете една функция или клас за работа с различни типове данни, използвайки шаблони.

Шаблоните често се използват в по-голяма кодова база с цел повторна употреба и гъвкавост на програмите.

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

  • Шаблони за функции
  • Шаблони за класове

Шаблони за функции

Шаблонът на функция работи в подобна на нормалната функция, с една ключова разлика.

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

Обикновено, ако трябва да извършите идентични операции върху два или повече типа данни, използвате претоварване на функцията, за да създадете две функции с необходимата декларация за функция.

По-добър подход обаче би бил използването на функционални шаблони, защото можете да изпълнявате една и съща задача, като пишете по-малко и поддържаем код.

Как да декларирам шаблон за функция?

Шаблонът на функцията започва с шаблон за ключова дума , последван от параметър / и на шаблона вътре, който е последван от декларация за функция.

 template < class T> T someFunction (T arg) (…)

В горния код T е аргумент на шаблон, който приема различни типове данни (int, float), а class е ключова дума.

Можете също да използвате ключова дума 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 е по-голямо. Въведете два знака: z Z z има по-голяма ASCII стойност.

В горната програма Large()е дефиниран шаблон за функция, който приема два аргумента n1 и n2 от тип данни T. Tозначава, че аргументът може да бъде от всякакъв тип данни.

Large() функция връща най-големия от двата аргумента, използвайки проста условна операция.

Във вътрешността на main()функцията, променливи на три различни типове данни: int, floatи charса обявени. След това променливите се предават на Large()шаблона на функцията като нормални функции.

По време на изпълнение, когато цяло число се предава на функцията за шаблон, компилаторът знае, че трябва да генерира Large()функция, за да приеме аргументите int и го прави.

По същия начин, когато се предават данни с плаваща запетая и char, той познава типовете аргументи и съответно генерира 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; ) 

Изход

Преди да предадете данни на шаблон за функция. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b След предаване на данни към шаблон за функция. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

В тази програма вместо извикване на функция чрез предаване на стойност се издава повикване чрез препратка.

В Swap()шаблона функция може да отнеме два аргумента и ги суапове за справка.

Шаблони за класове

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

Понякога се нуждаете от изпълнение на клас, което е еднакво за всички класове, само използваните типове данни са различни.

Обикновено ще трябва да създадете различен клас за всеки тип данни ИЛИ да създадете различни променливи и функции в рамките на един клас.

Това ненужно ще раздуе вашата кодова база и ще бъде трудно да се поддържа, тъй като промяната е един клас / функция трябва да се извърши за всички класове / функции.

Шаблоните на класове обаче улесняват повторното използване на един и същ код за всички типове данни.

Как да декларирам шаблон на клас?

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

В горната декларация Tе аргументът на шаблона, който е заместител за използвания тип данни.

Вътре в тялото на класа променливата член var и член функция someOperation()са от тип T.

Как да създам обект на шаблон на клас?

За да създадете обект на шаблон на клас, трябва да дефинирате типа данни вътре при създаване.

 className classObject; 

Например:

className classObject; className classObject; className classObject;

Пример 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; ) 

Изход

Int резултати: Числата са: 2 и 1. Събирането е: 3 Изваждането е: 1 Продуктът е: 2 Деление е: 2 Резултати с плаваща форма: Числата са: 2.4 и 1.2. Събирането е: 3.6 Изваждането е: 1.2 Продуктът е: 2.88 Делението е: 2

В горната програма Calculatorсе декларира шаблон на клас .

Класът съдържа два частни члена от тип T: num1 & num2 и конструктор за инициализиране на членовете.

Той също така съдържа функции на публичен член за изчисляване на събирането, изваждането, умножението и разделянето на числата, които връщат стойността на типа данни, дефиниран от потребителя. По същия начин, функция displayResult()за показване на крайния изход на екрана.

Във main()функцията се създават два различни Calculatorобекта intCalcи floatCalcза типове данни: intи floatсъответно. Стойностите се инициализират с помощта на конструктора.

Забележете, че използваме и докато създаваме обектите. Те казват на компилатора типа данни, използван за създаването на класа.

Това създава дефиниция на клас за intи float, които след това се използват съответно.

След това displayResult()се извиква и двата обекта, който изпълнява операциите на калкулатора и показва изхода.

Интересни статии...