Большой проблемой при попытке сделать что-то подобное является грамматика. Параметры шаблона заранее указывают, являются ли они шаблонами, типами или значениями, и наиболее важной причиной для этого является грамматика.
C ++ - контекстно-зависимая грамматика. Это означает, что вы не можете знать только из последовательности токенов, что означает конкретная последовательность токенов. Например, IDENTIFIER LEFT_PAREN RIGHT_PAREN SEMICOLON
. Что это значит?
Это может означать вызов функции с именем IDENTIFIER
без параметров. Это может означать, что по умолчанию инициализируется значение класса с именем IDENTIFIER
. Это довольно разные вещи; Вы можете концептуально видеть их похожими, но грамматика C ++ - нет.
Шаблоны не являются макросами; они не делают вставку токенов. Есть некоторое понимание того, что часть кода в шаблоне должна означать конкретную вещь. И вы можете сделать это, только если вы хотя бы знаете, что это за параметр шаблона.
Чтобы сохранить эту способность, эти «параметры шаблона омни» нельзя использовать, пока вы на самом деле не поймете, что они означают. Таким образом, чтобы создать такую функцию в C ++, вам необходимо:
- Создайте новый синтаксис для объявления параметров шаблона omni (
auto
не сработает, поскольку он уже имеет определенное значение).
- Укажите синтаксис для определения того, что представляет собой параметр шаблона omni.
- Требовать от пользователя вызова этого синтаксиса, прежде чем он сможет использовать такие имена параметров в большинстве случаев. Обычно это делается с помощью какого-то специализированного блока
if constexpr
, но предложения по сопоставлению с образцом представляют интересный альтернативный / дополнительный способ их обработки (поскольку они могут быть выражениями, а также утверждениями). А операторы расширения представляют собой возможный способ доступа ко всем параметрам omni в пакете параметров.