- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
/* https://habr.com/ru/company/jugru/blog/524600/
Давайте теперь поговорим о метаклассах, коль скоро ваш вопрос был в первую очередь о них.
Для их реализации было необходимо три фундаментальных нововведения. Во-первых, программирование
во время компиляции. На момент начала работы над метаклассами оно частично присутствовало в
constexpr, но тогда оно было ещё сырое и не до конца обобщённое. Во-вторых, была необходима
рефлексия, по которой тогда только-только появились первые предложения, и рассчитывать на неё
было рискованно. В-третьих, нужна была генерация кода, создание исходного кода C++ во время
компиляции — на тот момент в C++ этого ещё ни разу не делали.
Но при наличии этих трёх предпосылок метаклассы становятся просто синтаксическим сахаром,
который во время компиляции применяет функцию рефлексии и генерации кода. Поэтому в
первоначальной статье по метаклассам (P0707) также написано об этих трёх вещах: рефлексии,
полном программировании во время компиляции, то есть возможности выполнять любой код C++
во время компиляции, и генерации кода C++; ничего этого на тот момент в языке не было.
Самым важным шагом в этом направлении стало добавление программирования во время компиляции.
Это значит, что вторая предпосылка метаклассов в C++20 почти закончена. Функции consteval
с гарантированным выполнением во время компиляции на самом деле были предложены именно в
статье, которую я только что упомянул. На основе моей статьи Эндрю Саттон (Andrew Sutton)
сделал реализацию метаклассов в Clang, с помощью которой были написаны consteval и некоторые
другие фичи C++20.
В общем, с программированием во время компиляции дела обстоят хорошо. Что касается рефлексии,
она входит в список семи приоритетов для C++23. Даже без учёта нарушений из-за COVID-19 я
сомневаюсь, что рефлексию завершат к 2023 году, но ей точно будет уделяться много усилий.
Это не может не радовать. Над генерацией сейчас тоже работают Дэвид Вандевурд и, опять-таки, Эндрю Саттон.
Когда рефлексия, consteval и генерация станут частью стандарта, для добавления метаклассов
будет достаточно заявки на пяти страницах, в которой мы просто поблагодарим за реализацию
этих трёх предпосылок, и предложим добавить поверх них синтаксический сахар, который позволит
во времени компиляции применять функцию к классу. В общем, в этой области сделано уже очень
многое, но, как видите, это проект, требующий много лет для завершения. Мне пришлось разбить
его на несколько более мелких заявок, чтобы вся работа не была забракована из-за одного
неудачного сегмента. Несмотря на это, мы всегда учитывали конечную цель — метаклассы; и мы
всегда ориентировались на определённый вариант использования.
Легковесная обработка исключений — более новый проект, я впервые предложил её комитету в 2018 году.
В отличие от метаклассов, на начальном этапе диалога прототипа ещё не было, и я хотел узнать, готов
ли комитет вообще двигаться в этом направлении. С самого начала мы получили положительную реакцию,
а также некоторые технические вопросы. В следующем году мы планируем начать работу над прототипом.
Когда прототип будет готов и мы сможем ответить на эти технические вопросы, мы составим более подробную заявку.
Наконец, нужно сказать ещё об одном проекте, обсуждение которого началось только в феврале этого года.
Это было в Праге на встрече юзер-группы, её запись выложена на YouTube. Речь идёт о передаче параметров и
инициализации. Здесь используется подмножество правил статического анализа, которые использовались для
Lifetime. Я уже подготовил об этом статью (под номером 708), но прежде чем подать её комитету, мне необходимо
будет создать прототип.
*/