You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C++ generator生成递减序列遇reverse_view报错,求解决方案

问题解答

为什么第一种写法报错?

ranges::reverse_view是视图类,它没有无参构造函数,必须接收一个可反转的范围作为构造参数。而管道操作符|要求右侧是范围适配器闭包对象(比如ranges::views::reverse),这类适配器能自动接收左侧的范围并生成对应的视图。你直接调用reverse_view()试图无参构造,编译器找不到匹配的函数,因此报错。

简单说:reverse_view是视图的具体类型,需要手动传范围;views::reverse是适配器,能通过管道链式处理左侧的范围。

其他正确实现方式

方式1:使用views::reverse管道适配器(推荐)

这是最符合C++20范围管道风格的写法,直接通过|链式调用反转:

vector<size_t> data = []() -> generator<size_t>
{ co_yield ranges::elements_of(ranges::iota_view(0, 11)); }() 
| ranges::views::reverse 
| ranges::to<vector>();

方式2:generator内部反转范围(你已验证的写法)

直接在generator里对iota_view反转后再yield,逻辑清晰:

[]() -> generator<size_t>{ co_yield ranges::elements_of(ranges::reverse_view(ranges::iota_view(0, 11))); }() 
| ranges::to<vector>();

方式3:使用ranges::reverse函数

ranges::reverse可以返回反转后的范围,也能配合管道使用:

vector<size_t> data = []() -> generator<size_t>
{ co_yield ranges::elements_of(ranges::iota_view(0, 11)); }() 
| ranges::reverse 
| ranges::to<vector>();

适配GoogleTest的优化写法

把generator逻辑抽成单独的lambda,让测试代码更整洁易读:

auto reversed_iota_gen = []() -> generator<size_t> {
    co_yield ranges::elements_of(ranges::views::reverse(ranges::iota_view(0, 11)));
};

INSTANTIATE_TEST_SUITE_P(
    MyTests,
    MyTestFixture,
    ::testing::Values(
        make_tuple(1, vector<size_t>{0}),
        make_tuple(1, reversed_iota_gen() | ranges::to<vector>())
    )
);

内容的提问来源于stack exchange,提问作者khteh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 15:44:50