Шаблони (Templates) - Elsys

lubo.elsys.bg.org

Шаблони (Templates) - Elsys

Шаблони (Templates)Любомир Чорбаджиев 1lchorbadjiev@elsys-bg.org1 Технологическо училище “Електронни системи”Технически университет, София29 март 2009 г.Л. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 1 / 63


Съдържание1 Нужда от шаблони2 Решение в стил C3 Решение в стил C++: използване на шаблони4 Дефиниране на шаблонна функция5 Дефиниране на шаблонен клас6 Екземпляри на шаблона7 Проверка на шаблона8 Пример: шаблонен стек (статичен)9 Шаблонни функции10 Пример: шаблонен масив с проверка на границите11 Пример: шаблонен стек (динамичен)Л. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 2 / 63


Нужда от шаблониПример: копиране на масив от цели числаЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 3 / 63Даден е масив от цели числа. Трябва да се копират стойноститена елемента на масива в друг масив.1 v o i d copy ( i n t dst [] , i n t src [] , i n t size ) {2 f o r ( i n t i =0;i< size ;i ++)3 dst [i ]= src [i ];4 }


Нужда от шаблониПример: копиране на масив от цели числаЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 4 / 631 #i n c l u d e < iostream >2 i n t main ( v o i d ) {3 i n t a [10] , b [10];4 f o r ( i n t i =0;i


Нужда от шаблониПример: копиране на масив от числа сплаваща запетаяЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 5 / 63Даден е масив от числа с плаваща запетая. Трябва да се копиратстойностите на елемента на масива в друг масив.Използването на функцията void copy(int a[], int b[], int size)води до непредвидими резултати.


Нужда от шаблониПример: копиране на масив от числа сплаваща запетаяЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 6 / 631 #i n c l u d e < iostream >2 i n t main ( v o i d ) {3 double c [10] , d [10];4 f o r ( i n t i =0;i


Нужда от шаблониПример: копиране на масив от числа сплаваща запетаяЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 7 / 63Директното решение е да се дефинира нова функция:1 v o i d copy ( double dst [] , double src [] , i n t size ) {2 f o r ( i n t i =0;i< size ;i ++)3 dst [i ]= src [i ];4 }


Нужда от шаблониПример: копиране на масив от числа сплаваща запетаяЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 8 / 631 #i n c l u d e < iostream >2 i n t main ( v o i d ) {3 double c [10] , d [10];4 f o r ( i n t i =0;i


ПроблемиНужда от шаблониАко се подхожда по този начин за всеки тип трябва да седефинира отделна версия на функцията copy().Използването на copy/paste за размножаване на кода води до:труден за поддържане код;вмъкване на трудни за откриване грешки.Необходимо е дефиницията на функцията copy() да бъдеобобщена по някакъв начин.За всички типове алгоритъма на функцията copy() е един и същ.Да се дефинира една функция, която да е в състояние да работи свсички типове.Л. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 9 / 63


Решение в стил CЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 10 / 63Решение в стил CЗа аргументи на функцията copy() могат да се използватуказатели от типа void*.1 v o i d copy_array ( v o i d * dst , v o i d * src , i n t size ) {2 f o r ( i n t i =0;i< size ;i ++) {3 s t a t i c _ c a s t < char * >( dst )[ i ]=4 s t a t i c _ c a s t < char * >( src )[ i ];5 }6 }При използването на тази функция, параметърът int size трябвада се интерпретира като размер на копирания масив в байтове, ане като брой елементи в масива.


Решение в стил CЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 11 / 63Решение в стил C1 #i n c l u d e < iostream >2 i n t main ( v o i d ) {3 i n t a [10] , b [10];4 double c [10] , d [10] , e [10];5 f o r ( i n t i =0;i


Решение в стил CЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 12 / 63Решение в стил C1 copy_array (b ,a , s i z e o f (a ));2 f o r ( i n t i =0;i


Решение в стил CЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 13 / 63Решение в стил C1 copy_array (d ,c , s i z e o f (c ));2 f o r ( i n t i =0;i


Решение в стил CЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 14 / 63Решение в стил C1 copy_array (e ,a , s i z e o f (a ));2 f o r ( i n t i =0;i


Решение в стил CЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 15 / 63Решение в стил CВ този стил са дефинирани и функциите memcpy() и memcmp() отстандартната C-библиотека.За решаване на задачата за копиране на масив директно може дасе използва функцията memcpy().


Решение в стил CЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 16 / 63Решение в стил C1 #i n c l u d e < cstdlib >2 #i n c l u d e < iostream >3 i n t main ( v o i d ) {4 i n t a [10];5 double b [10];6 f o r ( i n t i =0;i


Решение в стил CРешение в стил C: проблемиЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 17 / 63Лесно се правят грешки в използваните типове данни.Компилаторът не е в състояние да проследи грешната употребана променливи с различни типове.Резултатът от подобни програми зависи от архитектурата напроцесора, върху който се изпълняват.


Решение в стил C++: използване на шаблониРешение в стил C++: използване на шаблониЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 18 / 63Решението в стил C++ е да се дефинира шаблонна функцияcopy().1 template < c l a s s T >2 v o i d copy (T dst [] , T src [] , i n t size ) {3 f o r ( i n t i =0;i< size ;i ++)4 dst [i ]= src [i ];5 }Използването на тази функция е тривиално:


Решение в стил C++: използване на шаблониРешение в стил C++: използване на шаблониЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 19 / 631 #i n c l u d e < iostream >2 i n t main ( v o i d ) {34 // версия на copy() за масиви от int5 i n t a [10] , b [10];6 f o r ( i n t i =0;i


Решение в стил C++: използване на шаблониРешение в стил C++: използване на шаблониЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 20 / 631 // версия на copy() за масиви от double2 double c [10] , d [10];3 f o r ( i n t i =0;i


Дефиниране на шаблонна функцияШаблониЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 21 / 63Шаблоните обезпечават непосредствената поддръжка на таканареченото обобщено програмиране, т.е. програмиране, при коетокато параметри се използват типове.Механизмът на шаблоните в C++ позволява използването натипове в качеството на параметри при дефинирането на функциии класове.Шаблонът зависи само от тези свойства на параметъра-тип,които той явно използва; поради това не е необходимо различнитетипове, които се използват като параметри на шаблона да бъдатсвързани по какъвто и да било начин.


Дефиниране на шаблонна функцияШаблонни функцииЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 22 / 63Шаблонните функции описват поведение, което може да бъдеприлагано към различни типове.Една шаблонна функция описва семейство от функции, коитоимат еднакво поведение, но могат да бъдат прилагани къмразлични типове аргументи.Конструкцията за дефиниране на шаблонна функция е:1 template < c l a s s R , c l a s s T ,... >2 R function_name (T arg1 ,...) {3 ...4 }


Дефиниране на шаблонна функцияПример: повдигане на кубЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 23 / 63Задача: да се напише функция, която за дадено число xизчислява x^3.За решаването на тази задача е възможно да се използватмакроси на препроцесора.1 #d e f i n e CUBE (x) (( x )*( x )*( x ))Такова решение работи за всякакви типове.1 #i n c l u d e < iostream >2 i n t main ( v o i d ) {3 std :: cout


Дефиниране на шаблонна функцияПример: повдигане на кубЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 24 / 63Друг вариант за решаване на тази задача е да се дефинирашаблонна функция cube().1 template < typename T >2 T cube ( c o n s t T& x) {3 r e t u r n x*x*x;4 }56 #i n c l u d e < iostream >7 i n t main ( v o i d ) {8 std :: cout


Дефиниране на шаблонна функцияПример: намиране на максимумЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 25 / 63Задача: да се дефинира функция max(), която връща по-големияот два аргумента.1 template < c l a s s T >2 c o n s t T& maxvalue ( c o n s t T& a , c o n s t T& b) {3 r e t u r n a >b?a:b;4 }56 #i n c l u d e < iostream >7 i n t main ( v o i d ) {8 std :: cout


Дефиниране на шаблонен класДефиниране на шаблонЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 26 / 63template < c l a s s T > c l a s s stack {T data_ [128];p u b l i c :c o n s t T& pop ( v o i d ) c o n s t ;//...};Префиксът template се използва за дефиниране нашаблон (template).При използване на даден шаблон, на мястото на “формалнияпараметър” class T се предава фактическият тип.В дефиницията на шаблона формалното име на тип T се използваточно по същия начин, по който се използват и имената надругите типове.


Дефиниране на шаблонен класДефиниране на шаблонЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 27 / 63template < c l a s s T > c l a s s stack {T data_ [128];p u b l i c :c o n s t T& pop ( v o i d ) c o n s t ;//...};Областта на видимост за T завършва в края на обявата,започнала с template.В дефиницията template T е име на произволен тип; не езадължително T да бъде име на клас.


Екземпляри на шаблонаЕкземпляри на шаблонаЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 28 / 63stack < double > doubleStack ;stack < i n t > intStack ;Процесът на генериране на клас от (1) шаблон на клас и (2)аргумент на шаблона се нарича създаване на екземпляр нашаблона (template instantiation).Генерирането на клас от шаблон на клас се изпълнява откомпилатора.Класът, генериран от шаблон на клас, е обикновен C++ клас.Използването на шаблони не предполага допълнителнимеханизми по време на изпълнение на кода.Шаблоните обезпечават ефективен начин за генериране на код.


Екземпляри на шаблонаПараметри на шаблонаЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 29 / 63Като параметри на даден шаблон могат да се използват не самотипове:Пример:template < c l a s s T , i n t size > c l a s s Buffer {T data_ [ size ];i n t size_ ;p u b l i c :Buffer ( v o i d ) : size_ ( size ){}//...};


Проверка на шаблонаПроверка на типоветеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 30 / 63Проверка в точката на дефиниция: проверка за синтактичнигрешки и грешки, които не зависят от фактическитепараметри-типове на шаблона.Проверка при създаване на екземпляр на шаблона: проверка засъответствие на фактическите типове, предадени на шаблона.Проверка в момента на свързване.


Проверка на шаблонаПроверка на типовете: примерЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 31 / 631 template < c l a s s T > c l a s s stack {2 T data_ [128];3 i n t top_ ;4 p u b l i c :5 stack ( v o i d ) : top_ ( -1) {}6 //...7 v o i d print_all ( v o i d ) {8 f o r ( i n t i =0;i


Проверка на шаблонаПроверка на типовете: примерДа приемем, че за класа Rec не е дефиниран оператор за изходoperator


Пример: шаблонен стек (статичен)Л. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 33 / 63Пример: заглавен файл stack.hpp1 #i f n d e f STACK_HPP__2 #d e f i n e STACK_HPP__34 #i n c l u d e < exception >56 template < c l a s s T >7 c l a s s stack {8 s t a t i c c o n s t u n s i g n e d size_ =128;9 T data_ [ size_ ];10 i n t top_ ;11 p u b l i c :12 stack ( v o i d );


Пример: шаблонен стек (статичен)Л. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 34 / 63Пример: заглавен файл stack.hpp1 c o n s t T& top ( v o i d ) c o n s t ;2 v o i d pop ( v o i d );3 v o i d push ( c o n s t T& val );4 b o o l empty ( v o i d ) c o n s t ;5 };67 template < c l a s s T >8 stack :: stack ( v o i d )9 : top_ ( -1)10 {}


Пример: шаблонен стек (статичен)Л. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 35 / 63Пример: заглавен файл stack.hpp12 template < c l a s s T > c o n s t T&3 stack :: top ( v o i d ) c o n s t {4 i f ( top_ < 0) {5 throw std :: exception ();6 }7 r e t u r n data_ [ top_ ];8 }9 template < c l a s s T > v o i d10 stack :: pop ( v o i d ) {11 i f ( top_


Пример: шаблонен стек (статичен)Л. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 36 / 63Пример: заглавен файл stack.hpp1 template < c l a s s T > v o i d2 stack :: push ( c o n s t T& val ){3 i f ( size_ b o o l9 stack :: empty ( v o i d ) c o n s t {10 r e t u r n top_


Пример: шаблонен стек (статичен)Пример: използване на шаблонен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 37 / 631 #i n c l u d e < iostream >2 #i n c l u d e " stack . hpp "34 i n t main ( v o i d ) {5 stack < i n t > si ;67 f o r ( i n t i =0;i


Пример: шаблонен стек (статичен)Пример: използване на шаблонен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 38 / 631 stack < f l o a t > sf ;2 f o r ( i n t i =0; i


Пример: шаблонен стек (статичен)Пример: използване на шаблонен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 39 / 631 stack < stack < i n t > > ssi ;2 f o r ( i n t i =0;i temp ;4 f o r ( i n t j =0;j


Пример: шаблонен стек (статичен)Пример: използване на шаблонен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 40 / 631 w h i l e (! ssi . empty ()){2 stack < i n t > ts = ssi . top ();3 w h i l e (! ts . empty ()){4 std :: cout


Пример: шаблонен стек (статичен)Пример: стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 41 / 63Резултати:9 8 7 6 5 4 3 2 1 090 80 70 60 50 40 30 20 10 04 4 4 4 4 4 4 4 4 43 3 3 3 3 3 3 3 3 32 2 2 2 2 2 2 2 2 21 1 1 1 1 1 1 1 1 10 0 0 0 0 0 0 0 0 0


Шаблонни функцииШаблони на функцииЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 42 / 63Механизмът на шаблоните може да се ползва за обобщенодефиниране на функции:Пример:1 template < c l a s s R , c l a s s T >2 c o n s t R& fun (T& a ){3 //...4 }1 template < c l a s s T >2 v o i d sort ( vector & v ){3 //...4 }


Шаблонни функцииШаблони на функцииЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 43 / 631 template < c l a s s T >2 v o i d swap (T& a , T& b) {3 T tmp =a;4 a=b;5 b= tmp ;6 }


Шаблонни функцииШаблони на функцииЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 44 / 63При шаблоните на функции съществен момент се явявавъзможността за извеждане (deduction) на типа на аргументитена шаблона.Пример:1 template < c l a s s T > T& fun ( c o n s t T& val ) { /* ... */ }2 i n t i =0 , p =10;3 i= fun (p );45 template < c l a s s T > c o n s t T& fun1 ( v o i d ) { /* ... */ }6 i n t x= fun1 (); //error7 i n t y= fun1 < i n t >();


Шаблонни функцииШаблони на функцииЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 45 / 631 template < c l a s s R , c l a s s T > R fun2 (T& v) { /* ... */ }2 i n t z =0;3 double w =0;4 w= fun2 < double , i n t >( z );5 w= fun2 < double >( z );6 w= fun2 (z ); // error!!


Пример: шаблонен масив с проверка на границитеИзползване на шаблони: масив с проверка награницитеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 46 / 631 #i n c l u d e < iostream >2 #i n c l u d e < exception >3 u s i n g namespace std ;45 template < c l a s s T >6 c l a s s Array {7 u n s i g n e d i n t size_ ;8 T* data_ ;9 p u b l i c :10 Array ( u n s i g n e d i n t size =10)11 : size_ ( size ), data_ (new T[ size_ ])12 {}


Пример: шаблонен масив с проверка на границитеИзползване на шаблони: масив с проверка награницитеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 47 / 631 Array ( c o n s t Array & other )2 : size_ ( other . size_ ), data_ ( new T[ size_ ])3 {4 f o r ( u n s i g n e d i n t i =0; i < size_ ; i ++)5 data_ [i ]= other . data_ [i ];6 }7 ~ Array ( v o i d ) {8 d e l e t e [] data_ ;9 }10 u n s i g n e d size () c o n s t {11 r e t u r n size_ ;12 }


Пример: шаблонен масив с проверка на границитеИзползване на шаблони: масив с проверка награницитеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 48 / 631 Array & o p e r a t o r =( c o n s t Array & other ) {2 i f ( t h i s !=& other ) {3 d e l e t e [] data_ ;4 size_ = other . size_ ;5 data_ =new T[ size_ ];6 f o r ( u n s i g n e d i =0;i< size_ ;i ++)7 data_ [i ]= other . data_ [i ];8 }9 r e t u r n * t h i s ;10 }


Пример: шаблонен масив с проверка на границитеИзползване на шаблони: масив с проверка награницитеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 49 / 631 T& o p e r a t o r []( u n s i g n e d i n t index )2 throw ( exception )3 {4 i f ( index >= size_ ) {5 throw exception ();6 }7 r e t u r n data_ [ index ];8 }9 };


Пример: шаблонен масив с проверка на границитеИзползване на шаблони: масив с проверка награницитеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 50 / 631 i n t main ( v o i d ) {2 Array < i n t > a1 (3) , a2 ;3 f o r ( i n t i =0;i


Пример: шаблонен масив с проверка на границитеИзползване на шаблони: масив с проверка награницитеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 51 / 631 t r y {2 cout


Пример: шаблонен масив с проверка на границитеИзползване на шаблони: масив с проверка награницитеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 52 / 631 Array < double > a3 (3) , a4 ;2 f o r ( i n t i =0;i


Пример: шаблонен масив с проверка на границитеИзползване на шаблони: масив с проверка награницитеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 53 / 631 t r y {2 cout


Пример: шаблонен масив с проверка на границитеИзползване на шаблони: масив с проверка награницитеЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 54 / 63lubo@dobby:~/school/cpp/notes> ./a.outa2[0]=0a2[1]=1a2[2]=2exception catched...a4[0]=3.14a4[1]=6.28a4[2]=9.42exception catched...


Пример: шаблонен стек (динамичен)Използване на шаблони: динамичен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 55 / 631 #i n c l u d e < iostream >2 #i n c l u d e < exception >3 u s i n g namespace std ;45 template < c l a s s T >6 c l a s s Stack {7 c o n s t s t a t i c u n s i g n e d i n t chunk_ =2;8 i n t size_ ;9 T * data_ ;10 i n t top_ ;


Пример: шаблонен стек (динамичен)Използване на шаблони: динамичен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 56 / 631 p u b l i c :2 Stack ( v o i d )3 : size_ ( chunk_ ),4 data_ (new T[ size_ ]) ,5 top_ ( -1)6 {}7 ~ Stack ( v o i d ) {8 d e l e t e [] data_ ;9 }


Пример: шаблонен стек (динамичен)Използване на шаблони: динамичен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 57 / 631 Stack ( c o n s t Stack & other )2 : size_ ( other . size_ ),3 data_ (new T[ size_ ]) ,4 top_ ( other . top_ )5 {6 f o r ( i n t i =0; i


Пример: шаблонен стек (динамичен)Използване на шаблони: динамичен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 58 / 631 Stack & o p e r a t o r =( c o n s t Stack & other ) {2 i f ( t h i s !=& other ) {3 d e l e t e [] data_ ;4 size_ = other . size_ ;5 top_ = other . top_ ;6 data_ =new T[ size_ ];7 f o r ( i n t i =0;i


Пример: шаблонен стек (динамичен)Използване на шаблони: динамичен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 59 / 631 v o i d push ( c o n s t T& v) {2 i f ( top_ >=( size_ -1)) {3 resize ();4 }5 data_ [++ top_ ]= v;6 }7 T pop ( v o i d ) {8 i f ( top_


Пример: шаблонен стек (динамичен)Използване на шаблони: динамичен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 60 / 631 p r i v a t e :2 v o i d resize ( v o i d ) {3 T * oldData = data_ ;4 data_ =new T[ size_ + chunk_ ];5 f o r ( i n t i =0;i< size_ ;i ++)6 data_ [i ]= oldData [i ];7 d e l e t e [] oldData ;8 size_ += chunk_ ;9 }10 };


Пример: шаблонен стек (динамичен)Използване на шаблони: динамичен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 61 / 631 i n t main ( v o i d ) {2 Stack < i n t > st ;3 st . push (1);4 st . push (2);5 st . push (3);67 Stack < i n t > st1 = st ;8 cout


Пример: шаблонен стек (динамичен)Използване на шаблони: динамичен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 62 / 631 t r y {2 cout


Пример: шаблонен стек (динамичен)Използване на шаблони: динамичен стекЛ. Чорбаджиев (ELSYS) Шаблони (Templates) 29 март 2009 г. 63 / 63lubo@kid:~/school/cpp/notes$ ./a.out321321exception catched...

More magazines by this user
Similar magazines