Как сопрограмма должна принимать константный диапазон?C++

Программы на C++. Форум разработчиков
Anonymous
Как сопрограмма должна принимать константный диапазон?

Сообщение Anonymous »

Я хочу реализовать сопрограмму, которая принимает диапазон и сохраняет его нетронутым (ссылка на константу модуля).
Пусть coroutine_foo будет сопрограммой: как бы вы реализовали ее сигнатуру? >
Поскольку копирование контейнера обходится дорого, а сопрограммы должны принимать только ссылки на объекты, которые гарантированно будут активны на протяжении всего времени жизни сопрограммы, я думаю, что это инклюзивная foo_coroutine:
  • Принимать диапазоны, являющиеся значениями lvalue. В этом случае следует создать const ссылку на lvalue, которая безопасна, поскольку контейнер жив на протяжении всей сопрограммы. Я думаю о

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

    foo_coroutine(const std::ranges::range auto&)
  • Принимать представления диапазона по значению. Я думаю, что foo_coroutine(std::ranges::borrowed_range auto) принимает по значению
    для этого, поскольку заимствованный_диапазон семантически гарантирует дешевое копирование, и его безопаснее копировать.
    Не следует принимать контейнеры по значению (поскольку их копирование дорого
    ) — поэтому следует блокировать диапазоны значений rvalue. Я имею в виду: coroutine_foo(const std::ranges::range auto&&) = delete
Подводя итог, я хочу разрешить эти позывные сосуществуют:

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

auto coroutine_foo(const std::ranges::range auto& rng) {
return coroutine_foo_impl(rng);
}
       
auto coroutine_foo(std::ranges::borrowed_range auto rng) {
return coroutine_foo_impl(std::move(rng)); // though move is probably pointless here
}
   
auto coroutine_foo(const std::ranges::range auto&&) = delete;
Они явно не могут сосуществовать как есть, поскольку первый и третий — это by ссылка, а второй по значению. Как я могу заставить их сосуществовать?
Примечание: Я думаю, что это будет подходящий API для сопрограммы, которой задан диапазон, который не следует изменять, но я что-то упускаю?

Подробнее здесь: https://stackoverflow.com/questions/792 ... onst-range

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