使用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
相关产品推荐
相关产品推荐

