Использование std::ranges::to с std::arrayC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование std::ranges::to с std::array

Сообщение Anonymous »

Я хотел бы заменить этот код с std::vector на std::array, но я полагаю, что это невозможно сделать, поскольку std::array не является контейнером, который понимает std::ranges::to.
constexpr auto dice = std::views::iota(1, 7);
static_assert(dice.size() == 6);
std::print("{}\n", dice | std::ranges::to());

Я знаю, что могу явно сконструировать std::array, но мне бы хотелось симметрии с прецедентом использования std::vector, и это кажется довольно повторяющимся и некрасивым, поскольку размер и тип диапазона известны во время компиляции:
constexpr auto arr = [&]() {
std::array result;
std::ranges::copy(dice, result.begin());
return result;
}();
std::print("{}\n", arr);

Я также подумывал о создании помощника, например
struct to_arr_functor {
template
consteval auto operator()(const R& range) const {
using T = std::ranges::range_value_t;
constexpr std::size_t N = std::ranges::size(range);
std::array arr{};
std::ranges::copy(range, arr.begin());
return arr;
}

template
friend constexpr auto operator|(const R& range, const to_arr_functor& ta) {
return ta(range);
}
};

но проблема отсутствия аргумента constexpr не позволяет этому работать.
P.S. Я знаю, что в целом представления не имеют размера, который известен без их оценки (например, фильтра), но этот вопрос относится ко всем представлениям, которые его имеют, например. Transform.
РЕДАКТИРОВАТЬ: я нашел один из способов работы, но это не очень красиво, поскольку я изобретаю велосипед(ranges::to)
template
consteval auto to_arr() -> std::array {
std::array result;
std::ranges::copy(rng, result.begin());
return result;
}


Подробнее здесь: https://stackoverflow.com/questions/795 ... h-stdarray
Ответить

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

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

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

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

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