首页 > 解决方案 > 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::<lambda(_Range&&) >'和 'std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::__adaptor::operator|<std::ranges::views::<lambda(_Range&&) >::<lambda(_Up&& )> >') 13 | }); | ^ 在 test.cpp:2 中包含的文件中:/usr/include/c++/10/ranges:1155:14:注意:候选人:'constexpr 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&&) >& )' 1155 | 结构 _RangeAdaptorClosure : 公共 _RangeAdaptor<_Callable> | ^~~~~~~~~~~~~~~~~~~~ /usr/include/c++/10/ranges:1155:14: 注意:从'std::ranges: 参数1 没有已知的转换: :views::__adaptor::_RangeAdaptorClosurestd::ranges::views::__adaptor::operator|<std::ranges::views::<lambda(_Range&&) >::<lambda(_Up&&)> >' to 'const std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::<lambda(_Range&&) >&' /usr/include/c++/10/ranges:1155:14: 注意:候选:'constexpr std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::<lambda(_Range&&) >& std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::< lambda(_Range&&) >::operator=(std::ranges::views::__adaptor::_RangeAdaptorClosurestd::

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

标签: c++rangec++20compositionstd-ranges

解决方案


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

因此,这类运行时有条件的事情不容易完成。您的情况很简单,因为您只使用filters,并且您可以完全控制过滤器本身是什么。因此,您可以将条件逻辑推入过滤器。

但是任何比这更复杂的东西,或者不受filters 支配的东西,都行不通。

有一些方法可以在编译时条件下做到这一点,但这些方法在元编程方面往往会变得非常丑陋。


推荐阅读