Templates and generic programming
T.60
Минимизируйте зависимости шаблона от контекста
Причина
Облегчает понимание. Минимизирует ошибки, вызванные неожиданными зависимостями. Облегчает создание инструментов.
Пример
template<typename C>
void sort(C& c)
{
std::sort(begin(c), end(c)); // необходимая и полезная зависимость
}
template<typename Iter>
Iter algo(Iter first, Iter last)
{
for (; first != last; ++first) {
auto x = sqrt(*first); // потенциально неожиданная зависимость: какой sqrt()?
helper(first, x); // потенциально неожиданная зависимость:
// helper выбирается на основе first и x
TT var = 7; // потенциально неожиданная зависимость: какой TT?
}
}
Примечание
Шаблоны, как правило, находятся в заголовочных файлах, поэтому их контекстные зависимости более уязвимы к зависимостям от порядка #include, чем функции в .cpp-файлах.
Примечание
Операции шаблона только над его аргументами были бы одним из способов сведения числа зависимостей к минимуму, однако это, как правило, неуправляемо. Например, алгоритмы обычно используют другие алгоритмы и вызывают операции, не работающие исключительно с аргументами. А макросы — это отдельная тема!
Смотрите также: T.69
Контроль
??? Непросто