Как сопрограмма должна принимать константный диапазон?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
Ответить

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

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

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

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

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