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 <typename T>
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 <typename T>
T MyArray<T>::get(size_t index) {
return array[index]
}
main.cpp
--------
int main() {
MyArray<int> a(10);
MyArray<double> b(20);
MyArray<MyArray<int>> c(10); //массив массивов
}
- Шаблонный класс всегда находится в загловочном файле
- Без указания параметра шаблона шаблонный класс невозможно скомпилировать
- Длинное имя типа можно укоротить: typedef Matrix MyArray<MyArray<int>>;
4. Несколько параметров шаблона
template <class K, class V> //class синоним typename
struct Node {
K key;
V value;
};
5. Шаблонная функция
template <typename T>
void swap(T &a, T &b) {
T t(a);
a = b;
b = t;
}
int main() {
int a = 4;
int b = 5;
swap<int>(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 <typename T>
class vector {
private:
T* array;
};
class Dog {
bool operator<(const Dog &d) const {
}
};
int main() {
SortedVector<Dog> v;
}