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

C++ C++;20个范围-如何将合成视图分配给变量?,c++,range,c++20,composition,std-ranges,C++,Range,C++20,Composition,Std Ranges,有没有一种方法可以用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;

有没有一种方法可以用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::”和“std::ranges::views:”和“std::ranges::ranges::views::”和“std::rangeadapter::closurestd::ranges::views::”和“std::rangeadapter::ranges::views::”和“std::rangeadapter::views::”和“std::rangeadapter::ranges::” 13 | }); | ^ 在test.cpp中包含的文件中:2: /usr/include/c++/10/ranges:1155:14:注:候选者:'constexpr std::ranges::views::u适配器::u rangeAdapterClosureSt::ranges::views::&std::rangeAdapterClosureSt::views:::(const std::ranges::views:::u适配器::rangeAdapterClosureStStd::rangest::views::::rangeAdapterClosureSt:)视图:&' 1155 |结构|范围适配器关闭:公共|范围适配器 | ^~~~~~~~~~~~~~~~~~~~ /usr/include/c++/10/ranges:1155:14:注意:参数1从“std::ranges::views::u adapter:::_rangeadapterclosuresd::ranges::views:::u adapter::operator |'到“const std::ranges::views::u adapter:::u rangeadapter closuresd::rangest::views:&' /usr/include/c++/10/ranges:1155:14:注意:候选者:'constexpr std::ranges::views::u适配器::u rangeAdapterClosureSt::ranges::views::&std::rangeAdapterClosureSt::views::u适配器::rangeAdapterClosureSt::rangest::views:::u适配器:rangeAdapterClosureSt::rangest::rangest::views::&&&' /usr/include/c++/10/ranges:1155:14:注意:参数1从“std::ranges::views::u适配器::_rangeAdapterClosureStd::ranges::views:::u适配器::操作符|'到“std::ranges::views::u适配器::rangeAdapterClosureStd::rangest::views:&&” make:**[Makefile:3:生成]错误1


我试着在谷歌上搜索一些RangeAdapter或Closure的东西,但没有多大意义

不,这是不可行的代码。C++是静态类型的语言,而你有条件构建的每个视图都是不同的类型。C++不允许你改变现有对象的类型(至少,不是这样)。 因此,这些类型的运行时条件操作不容易完成。您的案例非常简单,因为您只使用了
filter
s,并且您可以完全控制过滤器本身是什么。因此,您可以将条件逻辑放入过滤器中

但是任何比这更复杂的东西,或者不受
过滤器
s控制的东西,都是行不通的


有很多方法可以利用编译时条件来实现这一点,但这些方法在元编程方面往往会变得非常丑陋。

只是好奇——你说“你有条件地构造的每个视图都是不同类型的”。。。是否存在一种“通用”类型,它以允许赋值的方式包含这两种类型?@matt:您可以创建某种
任何
,将函子存储在
std::function
或等效类型擦除的构造中。但是标准中不存在这样的东西,你会因为间接调用而失去过滤的效率。@Nicole啊,这是有道理的。谢谢