## Шаблони Функция/клас, която работи не с променливи от някакъв дефиниран тип, а с абстрактни променливи, се нарича шаблонна функция/клас ```c++ #include using namespace std; template T sum(T a, T b) { return a + b; } int main() { int a = 4; int b = 9; cout << sum(a, b) << endl; double c = 3.14; double d = 4.5; cout << sum(c,d) << endl; return 0; } ``` Компилаторът генерира т. нар. шаблонна функция, като замества параметрите на шаблона с типовете на съответните фактически параметри. **Задача 1:** Релизирайте структурата от данни опашка. Опашката трябва да работи с **произволни типове**. След като е добавен един елемент в края на опашката, той ще може да бъде извлечен (премахнат) единствено след като бъдат премахнати всички елементи преди него в реда, в който са добавени. **Пример**: ```c++ int main() { quene q; q.enqueue(3); q.enqueue(5); q.enqueue(10); cout << q.dequeue() << endl; //3 cout << q.dequeue() << endl; //5 cout << q.dequeue() << endl; //10 cout << q.isEmpty() << endl; //1 } ``` **Задача 2:** Създайте **шаблонна** опашка с k приоритета. При взимане на елемент от опашката трябва да се връща най-отдавна добавения елемент от тези с най-висок приоритет. ```c++ int main() { kPriorityQueue q(4); // 4 priorities - 0, 1, 2 и 3. q.enqueue('A',0): //adds A with lowest priority: 0 q.enqueue('B',3); q.enqueue('C',2); q.enqueue('D',2); q.enqueue('E',1); //q.enqueue('F', 5); //error! No such priority! q.dequeue(); // B q.dequeue(); // C q.dequeue(); // D q.dequeue(); // E q.dequeue(); // A } ```