* Шаблони
Публикувано на 29 ноември 2008 в раздел С/С++.
Шаблоните помагат когато искаме да напишем универсална функция, която да може да работи с всякакви типове данни. Синтаксисът е следния:
template <class <име-на-класа>>; <декларация на функция>
Следният пример демонстрира как може да напишем една функция "max" връщаща по-голямото от две числа, като може да ѝ подадем различни типове данни:
#include "stdafx.h" #include <iostream> using namespace std; template <class T> T max (T a, T b) { T result = (a>b)?a:b; return (result); } void main (){ int a=3, b=4; int c = max<int>(a,b); cout << "max(" << a << ","; cout << b << ") = " << c << endl; double d=4.6, e=2.18; double f = max<double>(d,e); cout << "max(" << d << ","; cout << e << ") = " << f << endl; // Може да сравнява и символи по ASCII код char g='a', h='z'; char i = max<char>(g,h); cout << "max(" << g << ","; cout << h << ") = " << i << endl; }
* Забележка: В примера типа данни в ъгловите скоби може да се пропусне при извикването на функцията, защото променливите които подаваме са от един и същ тип, както и очакваните входни параметри. Ако предаваме променливи от различен тип, то е задължително да укажем в какъв тип ще преобразуваме.
Възможно е да създадете шаблон, който работи с повече типове:
template A GetMin (B x, C y) { ... }
Ето как можем да използваме шаблони върху класове и техните член-функции:
#include "stdafx.h" #include <iostream> using namespace std; template <class T> class myClass { T a, b; public: myClass(T a, T b){ this->a=a; this->b=b; } T getmax(); }; template <class T> T myClass<T>::getmax (){ return ((a>b)?a:b); } void main () { int x = 5; int y = 6; myClass <int> obj(x, y); cout << obj.getmax() << endl; double a = 8.12; int b = 4; // Ще преобразуваме данните в double myClass <double> obj2(a, b); cout << obj2.getmax() << endl; // А сега ще ги преобразуваме в int myClass <int> obj3(a, b); cout << obj3.getmax() << endl; }
Виждате, че използвайки шаблони ние можем да правим нашите функции и класове много по-универсални.
T result = (a>b)?a:b;
return (result);
няма ли да е по-добре така :
return a > b ? a : b;
Да, по-добре ще е.