Templates and generic programming
T.3
Используйте шаблоны для выражения контейнеров и диапазонов
Причина
Контейнерам необходим тип элемента, и его выражение в виде аргумента шаблона является обобщённым, допускающим повторное использование и типобезопасным. Это также позволяет избежать хрупких или неэффективных обходных решений. Соглашение: именно так это делается в STL.
Пример
template<typename T>
// requires Regular<T>
class Vector {
// ...
T* elem; // указывает на sz элементов типа T
int sz;
};
Vector<double> v(10);
v[7] = 9.9;
Пример (плохой)
class Container {
// ...
void* elem; // указывает на size элементов некоего типа
int sz;
};
Container c(10, sizeof(double));
((double*) c.elem)[7] = 9.9;
Это не выражает напрямую намерения программиста и скрывает структуру программы от системы типов и оптимизатора.
Скрытие void* за макросами лишь маскирует проблемы и создаёт новые источники путаницы.
Исключения: Если нужен ABI-стабильный интерфейс, возможно, придётся предоставить базовую реализацию и выразить (типобезопасный) шаблон через неё. См. Стабильная база.
Контроль
- Помечать использование
void*и приведений за пределами низкоуровневого кода реализации