Есть ли способ type_traits проверить, совместим ли тип с диапазоном?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Есть ли способ type_traits проверить, совместим ли тип с диапазоном?

Сообщение Anonymous »

Рассмотрим класс, который использует шаблонный «итерируемый» тип, например:

Код: Выделить всё

template 
struct foo {
void bar(Iterable& collection) {
for (const auto& item : collection) {
// ...
}
}
};
Есть ли способ ограничить тип Iterable типами, совместимыми с циклом range-for?

Код: Выделить всё

template 
Ничто вроде std::is_range_for_iterable не бросается в глаза в списке свойств типов cppreference. Поэтому я углубился в изучение того, что на самом деле означает «совместимость с диапазоном for»:

Выражения, предназначенные только для представления /* Begin-expr */ и /* end-expr */ определяются следующим образом:
  • Если тип /* range */ является ссылкой на тип массива R:

    Если R связанного N, /* начальное выражение */ — это /* диапазон */ и /* конечное выражение */ — это /* диапазон */ + N< /code>.
  • Если R представляет собой массив с неизвестной границей или массив неполного типа, программа имеет неверный формат.
[*]Если тип /* диапазона */ является ссылкой к типу класса C, и поиск в области C имен Begin и End находит хотя бы одно объявление, тогда /* Begin-expr */ является /* диапазоном */.begin() и /* end-expr */ — это /* диапазон */.end().
[*]В противном случае /* начало-выражение */ — это начало(/* диапазон */) и /* end-expr */ — это end(/* range */), где начало и конец находятся посредством поиска, зависящего от аргумента (поиск без ADL не выполняется).


Из этого описания я мог бы что-нибудь придумать, используя is_array для первого случая и is_function или is_invocable для поиска соответствующих функций Begin() и end() для двух других случаев. Но я боюсь, что это будет полный беспорядок и, скорее всего, пострадает от крайних случаев (отказ от сценариев, которые на самом деле совместимы по диапазону, и наоборот).
Есть ли способ более простой или уже отработанный способ?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -range-for
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»