Templates and generic programming
T.10
Задавайте концепты для всех аргументов шаблона
Причина
Корректность и читаемость. Предполагаемый смысл (синтаксис и семантика) аргумента шаблона является фундаментальным для интерфейса шаблона. Концепт значительно улучшает документацию и обработку ошибок для шаблона. Задание концептов для аргументов шаблона — мощный инструмент проектирования.
Пример
template<typename Iter, typename Val>
requires input_iterator<Iter>
&& equality_comparable_with<iter_value_t<Iter>, Val>
Iter find(Iter b, Iter e, Val v)
{
// ...
}
или эквивалентно и более кратко:
template<input_iterator Iter, typename Val>
requires equality_comparable_with<iter_value_t<Iter>, Val>
Iter find(Iter b, Iter e, Val v)
{
// ...
}
Примечание
Простой typename (или auto) — наиболее слабый концепт. Его следует использовать только в редких случаях, когда нельзя предположить ничего, кроме «это тип». Обычно это нужно только когда (в коде шаблонного метапрограммирования) мы манипулируем чистыми деревьями выражений, откладывая проверку типов.
Ссылки: TC++PL4
Контроль
Помечать аргументы типа шаблона без концептов