{{{ 1. Проблема class MyArrayInt { private: int *array; size_t size; }; class MyArrayDouble { double *array; size_t size; }; 2. Решение на C MyArray.h --------- #define DefineArray(TYPE) class MyArray_ ## TYPE{\ private:\ TYPE *array;\ size_t size;\ }; main.c ------ #include "MyArray.h" DefineArray(int); DefineArray(double); int main() { MyArray_int a; MyArray_double b; } - Препроцессор может заменить не то (int TYPE) - Трудности при отладке (в редакторе один код, у компилятора другой) 3. Решение на C++ MyArray.h --------- template class MyArray { private: T *array; size_t size; public: MyArray(size_t sz) { size = sz; array = new T [sz]; } MyArray() { size = 100; array = new T [sz]; } }; template T MyArray::get(size_t index) { return array[index] } main.cpp -------- int main() { MyArray a(10); MyArray b(20); MyArray> c(10); //массив массивов } - Шаблонный класс всегда находится в загловочном файле - Без указания параметра шаблона шаблонный класс невозможно скомпилировать - Длинное имя типа можно укоротить: typedef Matrix MyArray>; 4. Несколько параметров шаблона template //class синоним typename struct Node { K key; V value; }; 5. Шаблонная функция template void swap(T &a, T &b) { T t(a); a = b; b = t; } int main() { int a = 4; int b = 5; swap(a, b); swap(b, a); //компилятор может вывести (deduce) типы сам по входным параметрам } 6. Структуры данных в стиле ООП class Object { virtual int compare(const Object *o) = 0 const; ... }; class SortedVector { private: Object **array; size_t size; size_t capacity; public: void push_back(Object *o) { } Object* get(size_t index) { } }; class Dog : public Object { virtual int compare(const Object &o) const { } }; int main() { SotrtedVector v; v.push_back(new Dog("sharik")); v.push_back(new Dog("bobik")); Dog* d = (Dog*)v.get(0); d->gaf(); } - Возможная ошибка v.push_back(new Dog()); v.push_back(new Cat()); - Для примитивных типов int, double нужны обертки Integer, Double 7. Структуры данных в стиле обобщенного (generic) программирования template class vector { private: T* array; }; class Dog { bool operator<(const Dog &d) const { } }; int main() { SortedVector v; } }}}