Реализовать view::concat с помощью сопрограммы C++?C++

Программы на C++. Форум разработчиков
Anonymous
Реализовать view::concat с помощью сопрограммы C++?

Сообщение Anonymous »

Я помню, как где-то читал цитату Эрика Ниблера: «Сопрограммы упрощают определение собственных диапазонов», что побудило меня попробовать использовать сопрограммы для реализации известных представлений::concat это еще не реализовано в C++23.
Поскольку в настоящее время не существует компилятора, реализующего std::generator, я планирую вместо этого использовать знаменитую библиотеку cppcoro. Моей первой попыткой было интуитивно расширить лямбда-выражение с помощью выражения сгиба (упрощенного до поддержки только диапазонов целых чисел):

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

#include 
#include 

template
auto concat(Rs&&... rngs) -> cppcoro::generator
{
([](auto& rng) -> cppcoro::generator {
for (auto elem : rng)
co_yield elem;
}(rngs), ...);
}
К сожалению, сопрограммы работают не так, приведенное выше просто расширяет лямбду и отбрасывает возвращаемый генератор.
Я также пробовал использовать синтаксический сахар, такой как co_yield rngs...;, но это явно недопустимый синтаксис.
Моим окончательным решением было создать лямбда-сопрограмму, которая выдает по одному элементу за раз. (что можно упростить с помощью ranges::elements_of в C++23). Поскольку возвращаемое значение сопрограммы является генератором, я могу сохранить разные генераторы с помощью std::array, а затем применить view::join к этому вложенному диапазону. для объединения его элементов:

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

template
auto concat(Rs&&... rngs) -> cppcoro::generator
{
auto lambda = [](auto& rng) -> cppcoro::generator {
for (auto elem : rng)
co_yield elem;
};
std::array nested_rng{lambda(rngs)...};
for (auto elem : nested_rng | views::join)
co_yield elem;
}
Это отлично работает для моего тестового примера (демо).
Однако такой подход требует дополнительного использования std::array для хранить разные генераторы и зависит от представлений::join. Интересно, есть ли более краткий и эффективный способ добиться этого?

Подробнее здесь: https://stackoverflow.com/questions/768 ... -coroutine

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