Концепты: упрощаем реализацию классов std utility
Поговорим немного о концептах в общем и о том, как они упрощают реализацию generic-классов.
Появляющиеся в C++20 концепты — давно и широко обсуждаемая тема. Несмотря на избыток материала, накопившегося за годы (в т. ч. выступления экспертов мирового уровня), среди прикладных программистов (не засыпающих ежедневно в обнимку со стандартом) все еще остается неразбериха, что же такое C++20-концепты и так ли они нам нужны, если есть проверенный годами enable_if. Частично виной тому то, как концепты эволюционировали за ~15 лет (Concepts Full + Concept Map → Concepts Lite), а частично то, что концепты получились непохожими на аналогичные средства в других языках (Java/С# generic bounds, Rust traits, …).
Доклад начнется с краткого обзора concept-related нововведений C++20, после чего мы посмотрим на реализацию некоторых классов и функций STL, сравнивая C++17 и C++20-решения. К примеру:
-
для реализации std::optional сейчас приходится использовать иерархию наследования глубины 7, в C++20 это будет не нужно;
-
для default-конструктора std::pair сейчас требуется 2 шаблонные функции, в C++20 — 1 нешаблонная;
-
часто шаблонные классы частично специализируются, в случае, когда у шаблонных параметров есть какие-то специальные свойства, c концептами это делать удобнее и правильнее.
От слушателей предполагается общее представление, что такое концепты и SFINAE. Также будет полезно знакомство со стандартной библиотекой C++, знание тонкостей и деталей реализации не требуется.