* Шаблони
Публикувано на 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;
Да, по-добре ще е.