Код: Выделить всё
template
struct foo {
void bar(Iterable& collection) {
for (const auto& item : collection) {
// ...
}
}
};
Код: Выделить всё
template
Выражения, предназначенные только для представления /* Begin-expr */ и /* end-expr */ определяются следующим образом:
- Если тип /* range */ является ссылкой на тип массива R:
Если R связанного N, /* начальное выражение */ — это /* диапазон */ и /* конечное выражение */ — это /* диапазон */ + N< /code>. - Если R представляет собой массив с неизвестной границей или массив неполного типа, программа имеет неверный формат.
[*]В противном случае /* начало-выражение */ — это начало(/* диапазон */) и /* end-expr */ — это end(/* range */), где начало и конец находятся посредством поиска, зависящего от аргумента (поиск без ADL не выполняется).
Из этого описания я мог бы что-нибудь придумать, используя is_array для первого случая и is_function или is_invocable для поиска соответствующих функций Begin() и end() для двух других случаев. Но я боюсь, что это будет полный беспорядок и, скорее всего, пострадает от крайних случаев (отказ от сценариев, которые на самом деле совместимы по диапазону, и наоборот).
Есть ли способ более простой или уже установленный способ?
Концепции C++20 предлагают гораздо лучшее решение этой проблемы, но я ищу решение C++17, где type_traits — лучший доступный инструмент .
Подробнее здесь: https://stackoverflow.com/questions/793 ... -range-for
Мобильная версия