Templates and generic programming
T.11
Везде, где возможно, используйте стандартные концепты
Причина
«Стандартные» концепты (предоставляемые GSL и стандартом ISO) избавляют нас от необходимости придумывать собственные концепты, продуманы лучше, чем то, что мы можем создать в спешке, и улучшают совместимость.
Примечание
Если вы не создаёте новую обобщённую библиотеку, большинство необходимых вам концептов уже определены в стандартной библиотеке.
Пример
template<typename T>
// не определяйте это: sortable уже есть в <iterator>
concept Ordered_container = Sequence<T> && Random_access<Iterator<T>> && Ordered<Value_type<T>>;
void sort(Ordered_container auto& s);
Этот Ordered_container вполне правдоподобен, но очень похож на концепт sortable из стандартной библиотеки. Лучше ли он? Правилен ли он? Точно ли он отражает требования стандарта к sort? Лучше и проще использовать sortable:
void sort(sortable auto& s); // лучше
Примечание
Набор «стандартных» концептов продолжает развиваться по мере приближения к стандарту ISO, включающему концепты.
Примечание
Разработать полезный концепт непросто.
Контроль
Сложно.
- Искать неограниченные аргументы, шаблоны с «нестандартными» концептами, шаблоны с «самодельными» концептами без аксиом.
- Разработать инструмент для обнаружения концептов (см., например, раннюю экспериментальную работу).