【问题标题】:C++20 ranges - How to assign composed views to a variable?C++20 范围 - 如何将组合视图分配给变量?
【发布时间】:2021-06-22 21:03:31
【问题描述】:

有没有办法让它在 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: error: no match for '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++ range c++20 composition std-ranges


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 只是好奇 - 你说“你有条件地构建的每个视图都是不同的类型”......是否有一个“通用”类型包含这两种类型它会允许分配吗?
    • @matt:您可以创建某种any_filter_view,将函子存储在std::function 或等效的类型擦除构造中。但是标准中不存在这样的东西,并且由于间接调用,您将失去过滤效率。
    • @Nicole 啊,这是有道理的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2017-03-11
    • 2016-11-04
    相关资源
    最近更新 更多