C, PHP, VB, .NET

Дневникът на Филип Петров


* Шаблони

Публикувано на 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;
	}

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

 



2 коментара


  1. st.evon каза:

    T result = (a>b)?a:b;
    return (result);
    няма ли да е по-добре така :
    return a > b ? a : b;

  2. Филип Петров каза:

    Да, по-добре ще е.

Добави коментар

Адресът на електронната поща няма да се публикува


*