C++20 范围 - 如何将组合视图分配给变量?

mat*_*att 5 c++ range composition c++20 std-ranges

有没有办法让它在 C++20 上工作?

\n
auto view = std::views::all;\n\nif (condition1) {\n    view = view | std::views::filter([](int i) {\n        return i%5 == 0;\n    });\n}\n\nif (condition2) {\n    view = view | std::views::filter([](int i) {\n        return i%10 == 0;\n    });\n}\n\n/* Do something with the view */\nfor (int i : list | view) {\n   ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我收到这个丑陋的错误:

\n
\n

test.cpp:13:10: 错误:与 \xe2\x80\x98operator=\xe2\x80\x99 不匹配(操作数类型为 \xe2\x80\x98std::ranges::views::__adaptor::_RangeAdaptorClosurestd::范围::视图::<lambda(_Range&&) >\xe2\x80\x99 和\xe2\x80\x98std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::__adaptor::operator| <std::ranges::views::<lambda(_Range&&) >::<lambda(_Up&&)> >\xe2\x80\x99)\n13 | });\n| ^\n在 test.cpp 包含的文件中:2:\n/usr/include/c++/10/ranges:1155:14: 注意:候选者:\xe2\x80\x98constexpr std::ranges::views::__adaptor: :_RangeAdaptorClosurestd::ranges::views::<lambda(_Range&&) >& std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::<lambda(_Range&&) >::operator=(const std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::<lambda(_Range&&) >&)\xe2\x80\x99\n1155 | 结构 _RangeAdaptorClosure :公共 _RangeAdaptor<_Callable>\n| ^~~~~~~~~~~~~~~~~~~~\n/usr/include/c++/10/ranges:1155:14: 注意:参数 1 没有来自 \xe2\x80 的已知转换\x98std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::__adaptor::operator|<std::ranges::views::<lambda(_Range&&) >::<lambda(_Up&&) > >\xe2\x80\x99 到 \xe2\x80\x98const std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::<lambda(_Range&&) >&\xe2\x80\x99\ n/usr/include/c++/10/ranges:1155:14: 注意:候选者:\xe2\x80\x98constexpr std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::<lambda( _Range&&) >& std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::<lambda(_Range&&) >::operator=(std::ranges::views::__adaptor::_RangeAdaptorClosurestd: :ranges::views::<lambda(_Range&&) >&&)\xe2\x80\x99\n/usr/include/c++/10/ranges:1155:14: 注意:参数 1 没有来自 \xe2\ 的已知转换x80\x98std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::__adaptor::operator|<std::ranges::views::<lambda(_Range&&) >::<lambda(_Up&& )> >\xe2\x80\x99 到 \xe2\x80\x98std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::<lambda(_Range&&) >&&\xe2\x80\x99\ nmake: *** [Makefile:3: 构建] 错误 1

\n
\n

我尝试用谷歌搜索一些 RangeAdaptorClosure 的东西,但这没有多大意义

\n

Nic*_*las 5

不,这不是可行的代码。C++ 是一种静态类型语言,您有条件构造的每个视图都属于不同的类型。C++ 不允许您更改现有对象的类型(至少不是那样)。

因此,这些类型的运行时条件操作不容易完成。您的情况很简单,因为您只使用filters,并且您可以完全控制过滤器本身的内容。因此,您可以将条件逻辑放入过滤器内。

但任何比这更复杂的事情,或者不受filters 约束的事情,都是行不通的。

有一些方法可以在编译时条件下做到这一点,但就元编程而言,这些方法往往会变得相当难看。