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

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

1
francesco 1 Май 2019 в 21:39

3 ответа

Лучший ответ

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

Нет.

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

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

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

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

5
Barry 1 Май 2019 в 18:55

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

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

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

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

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

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

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

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

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

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

-1
Gem Taylor 1 Май 2019 в 19:23