Lecture_11-Templates.ppt
- Количество слайдов: 14
Лекция 11. Шаблоны классов. Артур Садеков
Базовые механизмы. Определение. template<class T> class Stack { public: Stack(int size); ~Stack(); Stack(const Stack&); void T push(T); pop(); Stack& operator= (const Stack&); private: int size; int top; T *store; }; Nortel Networks Confidential
Базовые механизмы. Использование. void f() { Stack<char> c. Stack; Stack<int> i. Stack(100); Stack<double> d. Stack(50); c. Stack. push(‘a’); i. Stack. push(26); d. Stack. push(30. 125); char c = c. Stack. pop(); int i = i. Stack. pop(); double d = d. Stack. pop(); i. Stack = d. Stack; } Nortel Networks Confidential // ошибка !!!
Базовые механизмы. Определение членов. // Constructor template<class T> Stack<T>: : Stack(int _size) : size(_size), top(0) { store = new T[size]; } // Destructor template<class T> Stack<T>: : ~Stack() { delete[] store; } Зависим от конструктора без параметров Nortel Networks Confidential
Базовые механизмы. Определение членов (продолжение) // Method to put a character onto the stack template<class T> void Stack<T>: : push(T value) { Зависим от operator= if (top<size) store[top++] = value; } // Method to get the upper element from the stack // Returns: // - upper character, if stack is not empty, // - 0 (zero), if stack is empty. template<class T> T Stack<T>: : pop() { return top ? store[--top] : 0; } Зависим от приведения к целому Nortel Networks Confidential
Базовые механизмы. Определение членов (продолжение) // Method to get a maximum size of the certain stack template<class T> inline int Stack<T>: : get_max_size() const { return size; } // Method to get a current size of the certain stack template<class T> inline int Stack<T>: : get_current_size() const { return top; } Nortel Networks Confidential
Шаблоны • • Обеспечивают непосредственную поддержку обобщенного программирования (т. е. c использованием типов в качестве параметров) Шаблон зависит только от тех свойств параметра-типа, которые он явно использует Nortel Networks Confidential
Инстанцирование • • • Процесс генерации объявления класса по шаблону класса и аргументу шаблона Версия шаблона для конкретного аргумента шаблона называется специализацией Генерация версий шаблона - задача компилятора Nortel Networks Confidential
Инстанцирование. Пример. int main() { Stack<char> Stack<int> c. Stack; i. Stack(100); c. Stack. push(‘a’); i. Stack. push(26); c. Stack. pop(); int sz = i. Stack. get_max_size(); } Nortel Networks Confidential
Параметры шаблонов template<class Key, class Value> class Map; template<class T, T def_value> class Operand; template<class T, int size> class Buffer { public: T* get(int i) {return (i>=0 && i<size) ? &array[i] : 0; } private: T array[size]; }; Map<string, int> map; Operand<float, 3. 14> oper; Buffer<char, 128>; Nortel Networks Confidential
Специализация шаблонов классов template<class T> class Vector {/*. . . */}; template<> class Vector<string> {/*. . . */}; template<> class Vector<void*> {/*. . . */}; template<class T> class Vector<T*>: private Vector<void*> {/*. . . */}; Vector<int> vi; Vector<string> vs; Vector<void*> vpv; Vector<Shape*> vps; // T - Shape Vector<int**> vppi; // T - int* Nortel Networks Confidential
Минимизация разбухания кода template<class T> class Vector<T*>: private Vector<void*> { public: typedef Vector<void*> Base; Vector(): Base() {} T*& operator[] (int i) { return (T*) (Base: : operator[](i)); } }; Nortel Networks Confidential
Наследование и шаблоны template<class T> class Vector<T*>: private Vector<void*> {/*. . . */}; template<class T> class Vec<T>: private Vector<T> {/*. . . */}; template<class C> class Basic_ops; template<class T> class Container: public Basic_ops<Container<T>>; Nortel Networks Confidential
Конец Nortel Networks Confidential
Lecture_11-Templates.ppt