如何解决C++20 范围 - 如何将组合视图分配给变量?
有没有办法用 C++20 实现这个功能?
auto view = std::views::all;
if (condition1) {
view = view | std::views::filter([](int i) {
return i%5 == 0;
});
}
if (condition2) {
view = view | std::views::filter([](int i) {
return i%10 == 0;
});
}
/* Do something with the view */
for (int i : list | view) {
...
}
我收到了这个丑陋的错误:
test.cpp:13:10: 错误:'operator=' 不匹配(操作数类型是 'std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::' 和 'std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::__adaptor::operator|<:ranges::views::>:: >')
13 | });
| ^
在 test.cpp:2 包含的文件中:
/usr/include/c++/10/ranges:1155:14:注意:候选:'constexpr std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::& std ::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::::operator=(const std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::视图::&)'
第1155章结构 _RangeAdaptorClosure : 公共 _RangeAdaptor<_callable>
| ^~~~~~~~~~~~~~~~~~~~
/usr/include/c++/10/ranges:1155:14: 注意:从 'std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::__adaptor::operator 中的参数 1 没有已知的转换|<:ranges::views::>:: >' 到 'const std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views: :&'
/usr/include/c++/10/ranges:1155:14:注意:候选:'constexpr std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::& std ::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::::operator=(std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views ::&&)'
/usr/include/c++/10/ranges:1155:14: 注意:从 'std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::__adaptor::operator 中的参数 1 没有已知的转换|<:ranges::views::>:: >' 到 'std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views:: &&'
make: *** [Makefile:3: build] 错误 1
我尝试在谷歌上搜索一些 RangeAdaptorClosure 的东西,但没有多大意义
解决方法
不,这不是可行的代码。 C++ 是一种静态类型语言,您有条件地构建的每个视图都是不同的类型。 C++ 不允许您更改现有对象的类型(至少不是那样)。
因此,这些类型的运行时条件操作不容易完成。您的情况很简单,因为您只使用 filter
,并且您可以完全控制过滤器本身。因此,您可以将条件逻辑推入过滤器中。
但任何比这更复杂的事情,或者不受 filter
支配的事情,都行不通。
有一些方法可以使用编译时条件来做到这一点,但这些方法在元编程方面往往变得非常难看。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。