#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
выводится vsInnerType
. ?
Ответ №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>>
andRangeOf<convertible_to<char>>
чем-то, что находится в таблице (например, для C 23?), Или это предлагается в качестве примера для вещей, которые пользователь может реализовать. Я понимаю, что это последнее.5. @AmirKirsh Пользователь не может это реализовать, это должно быть изменение языка. Сейчас я не знаю такого предложения.