Поскольку в настоящее время не существует компилятора, реализующего 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