c ++ auto для шаблонов типов и типов - PullRequest
0 голосов
/ 01 мая 2019

В c ++ 17 template <auto> позволяет объявлять шаблоны с параметрами произвольного типа. Частично вдохновленный этим вопросом, было бы полезно иметь расширение template <auto>, которое фиксирует как типовые, так и нетиповые параметры шаблона, а также допускает его вариационную версию.

Планируется ли такое расширение в следующем выпуске c ++ 20? Есть ли какая-то фундаментальная проблема в том, чтобы иметь синтаксис, такой как template<auto... X>, с X любым типом или нетиповым параметром шаблона?

Ответы [ 3 ]

5 голосов
/ 01 мая 2019

Планируется ли такое расширение в следующем выпуске c ++ 20?

Нет.

Есть ли фундаментальная проблема в использовании синтаксиса, подобного template<auto... X>, с X параметром любого типа или нетипизированного шаблона?

Это было бы совершенно новым понятием в языке - имя, ссылающееся на либо тип , либо значение в том же месте.Таким образом, он будет содержать все виды дополнительных вопросов - и, возможно, дополнительные языковые функции, чтобы проверить, является ли X типом или нет.

Синтаксис, вероятно, не может быть template <auto... X> struct Y { };, так какэтот синтаксис уже имеет значение и означает кучу значений, а Y<int>{} неверно сформирован.

Определенно есть места, где такая вещь была бы полезна.Предложение просто должно решить эти проблемы.

1 голос
/ 01 мая 2019

Большой проблемой при попытке сделать что-то подобное является грамматика. Параметры шаблона заранее указывают, являются ли они шаблонами, типами или значениями, и наиболее важной причиной для этого является грамматика.

C ++ - контекстно-зависимая грамматика. Это означает, что вы не можете знать только из последовательности токенов, что означает конкретная последовательность токенов. Например, IDENTIFIER LEFT_PAREN RIGHT_PAREN SEMICOLON. Что это значит?

Это может означать вызов функции с именем IDENTIFIER без параметров. Это может означать, что по умолчанию инициализируется значение класса с именем IDENTIFIER. Это довольно разные вещи; Вы можете концептуально видеть их похожими, но грамматика C ++ - нет.

Шаблоны не являются макросами; они не делают вставку токенов. Есть некоторое понимание того, что часть кода в шаблоне должна означать конкретную вещь. И вы можете сделать это, только если вы хотя бы знаете, что это за параметр шаблона.

Чтобы сохранить эту способность, эти «параметры шаблона омни» нельзя использовать, пока вы на самом деле не поймете, что они означают. Таким образом, чтобы создать такую ​​функцию в C ++, вам необходимо:

  1. Создайте новый синтаксис для объявления параметров шаблона omni (auto не сработает, поскольку он уже имеет определенное значение).
  2. Укажите синтаксис для определения того, что представляет собой параметр шаблона omni.
  3. Требовать от пользователя вызова этого синтаксиса, прежде чем он сможет использовать такие имена параметров в большинстве случаев. Обычно это делается с помощью какого-то специализированного блока if constexpr, но предложения по сопоставлению с образцом представляют интересный альтернативный / дополнительный способ их обработки (поскольку они могут быть выражениями, а также утверждениями). А операторы расширения представляют собой возможный способ доступа ко всем параметрам omni в пакете параметров.
0 голосов
/ 01 мая 2019

Я не понимаю, как было бы полезно, чтобы аргумент шаблона мог динамически быть либо типом, либо значением? Операторы кода, которые используют типы, очень отличаются от тех, которые используют постоянные значения, введенные через аргумент шаблона.

Единственным способом было бы большое "if constexpr", что сделало бы его бессмысленным, на мой взгляд.

Хорошо, посмотрев более внимательно на упомянутый вопрос, я думаю, что здесь есть место для общего сквозного переноса различных явных реализаций базового шаблона, которые используют разные порядки параметров. Я до сих пор не вижу огромной выгоды. Ошибки компиляции, когда он пойдет не так, станут непостижимыми, если ничего больше!

Я помню, как мне говорили, что перегрузка и шаблоны собирались избавить мир от непостижимых сообщений об ошибках, генерируемых макросами. Я еще не видел это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...