Читайте также:
|
|
Шаблони. Шаблон (template) — це механізм параметризації визначення класу чи функції довільним типом. Шаблони дозволяють застосовувати простий спосіб введення різного роду загальних концепцій та методів їх спільного використання. Результуючий код за ефективністю не поступається написаному вручну спеціалізованому коду. Клас, що утворюється із шаблону класу у разі конкретного задання значення параметра, є цілком нормальним класом, тому шаблон класу називають генератором типів. Такий процес генерації оголошення класу чи функції за шаблоном та аргументом шаблону називають інстанціюванням. Якщо має місце генерація різних версій шаблону для різних значень параметра, то кожну з цих версій називають спеціалізацією.
Стандартна бібліотека С++ містить класи-контейнери, реалізовані у формі шаблонів. Ось деякі з них:
vector одновимірний масив елементів
list двозв’язний список елементів
deque черга елементів з двома кінцями
stack стек елементів
map асоціативний масив елементів
set множина елементів
Шаблон може мати кілька параметрів, які можуть бути: класами, стандартними типами, шаблонами; аргумент шаблону може бути константним виразом, адресою об’єкта чи функції; не може бути рядковим літералом. Допускаються значення аргументів шаблонів за замовчуванням, синтаксис та правила використання аналогічні з аргументами функцій за замовчуванням. Одна спеціалізація вважається більш спеціалізованою за іншу, якщо список аргументів першої спеціалізації відповідає другій, а не навпаки. Генеруючи типи, перевагу віддають більш спеціалізованим версіям:
template<class T> class Vector // шаблон
{ T* v;
int size;
public:
Vector();
Vector(int);
//...
};
Наведемо приклад створення об’єкта параметризованого класу:
int main()
{ //...
Vector<int> vi;
Vector<char*> vpc;
Vector<double> vd;
//...
}
template<class T T default_value=0> class Vector<T*>
{ /*…*/};
//часткова спеціалізація Vector для значень параметра, поданих у вигляді T*
Vector<int**> vppi; // тут T - int*
template<> class Vector<void*>{/*…*/};
//повна спеціалізація без вказання параметра шаблону
Vector<void*> vpv;
Іноді параметр шаблону функції може бути виведений з типів її аргументів під час виклику, тому його не потрібно вказувати під час інстанціювання:
template<class T> void sort(Vector<T>& v) {/*…*/} //шаблон функції
sort(vi); //vi типу Vector<int>, не потрібно писати sort<int>
Шаблони функцій можна перевантажувати звичайними методами. Розв’язуючи відповідності, перевагу віддають більш спеціалізованим шаблонам:
template<class T> T sqrt(T);
template<class T> complex<T> sqrt(complex<T>);
double sqrt(double);
void f(complex<double> z)
{
sqrt(2); //sqrt<int>(int)
sqrt(2.0); //sqrt(double)
sqrt(z); //sqrt<double>(complex<double>)
}
Шаблони можна ефективно використовувати для успадкування. Методику абстракції за допомогою шаблонів називають параметричним поліморфізмом або поліморфізмом часу компіляції на відміну від поліморфізму часу виконання, що забезпечується віртуальними функціями.
Можна створювати шаблони класів, що походять як від класу, що не є шаблоном, так і від шаблону класу. Класи чи шаблони класів можуть мати члени-шаблони. Члени-шаблони не можуть бути віртуальними.
Дата добавления: 2015-01-05; просмотров: 80 | Поможем написать вашу работу | Нарушение авторских прав |