Концепция диапазона для определенного типа

#c #range #c 20 #c -concepts

#c #диапазон #c 20 #c -концепции

Вопрос:

Существует ли уже определенная концепция для указания диапазона определенного типа в C 20 или в ranges-TS?

Что-то вроде:

 template < class T, class InnerType >
concept RangeOf =
  requires(Tamp;amp; t) {
    requires std::same_as<
           std::remove_cvref_t<decltype(*std::ranges::begin(t))>,
           InnerType
         >;
    std::ranges::end(t);
  };
  

Чтобы разрешить, например:

 void print(const RangeOf<char> autoamp; char_seq) { /* ... */ }
  

Комментарии:

1. И что происходит, когда вы используете концепцию, которую вы показали?

2. @cigien концепция позволяет сопоставлять диапазон определенного внутреннего типа, например, диапазон символов, вопрос в том, предложена ли такая концепция или определена.

3. Хорошо, затем отредактируйте свой вопрос, чтобы было ясно, что код работает, и что вы спрашиваете, существует ли уже такая концепция в STL.

4. Вопрос новичка: приведенная выше концепция имеет 2 параметра шаблона, причем RangeOf<char> , как T выводится vs InnerType . ?

Ответ №1:

Нет, это не так.

Способ написания этой конкретной концепции будет:

 template <typename R, typename V>
concept RangeOf = range<R> amp;amp; same_as<range_value_t<R>, V>;
  

Но тогда оказывается, что есть куча очень тесно связанных вещей, которые вы, возможно, захотите проверить. Возможно, вам действительно захочется взглянуть на reference тип, а не на value_type . Возможно, это:

 template <typename R, typename V>
concept RangeOf = range<R> amp;amp; same_as<range_reference_t<R>, V>;
  

Причина в том, считаете ли вы vector<char>amp; диапазон char или диапазон charamp; ? Возможно, это больше похоже на последнее, и именно последнее приводит к гораздо большему использованию. Но это не значит, что первое неверно, оно тоже полезно, только по-другому.

Затем вам нужно поговорить о том, хотите ли вы same_as или convertible_to . Есть некоторые алгоритмы, в которых вы хотели бы ограничиться первым, а некоторые, в которых последнее достаточно хорошо. Для меня это одна из мотивирующих причин, по которой требуются параметры шаблона концепции, чтобы:

 template <typename R, template <typename> concept C>
concept RangeOf = range<R> amp;amp; C<range_value_t<R>>;
  

Так что я могу легко написать RangeOf<same_as<char>> или RangeOf<convertible_to<char>> , в зависимости от того, что я на самом деле хочу.


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

Комментарии:

1. Предоставление этого пользователю не означает, что пользователь будет иметь в виду все веские аргументы и нюансы, которые вы представляете, поэтому может быть, что пользователь будет реализовывать что-то, в чем отсутствуют тонкие различия, которые вы поднимаете. Идея RangeOf<same_as<char>> и RangeOf<convertible_to<char>> звучит блестяще для меня, была ли она рассмотрена? Или это также оставлено для пользователя?

2. @AmirKirsh «веские аргументы и нюансы» справедливы… что нужно для рассматриваемого алгоритма. Некоторым алгоритмам нужно одно, другим нужно другое. Пользователь, пишущий алгоритм, должен знать, какое ограничение требуется алгоритму, и использовать соответствующее. Я не думаю, что здесь есть общий ответ.

3. @AmirKirsh И у нас нет параметров шаблона концепции в качестве языковой функции, вот почему я описал это как мотивирующую причину для желания такой вещи. Я не знаю, что вы имеете в виду, спрашивая, было ли это оставлено для пользователя.

4. Вопрос заключался в том, является ли RangeOf<same_as<char>> and RangeOf<convertible_to<char>> чем-то, что находится в таблице (например, для C 23?), Или это предлагается в качестве примера для вещей, которые пользователь может реализовать. Я понимаю, что это последнее.

5. @AmirKirsh Пользователь не может это реализовать, это должно быть изменение языка. Сейчас я не знаю такого предложения.