C++ 如何有条件地链接范围::查看?

C++ 如何有条件地链接范围::查看?,c++,c++20,range-v3,C++,C++20,Range V3,简单地说,我如何在视图链构造上进行编程分支 因为现在我能想到的只是#if,这不是一个好主意 auto adaptor = view::drop(x0) #if branch1 | view::drop(x1) #elif branch2 | view::filter(ft1) #endif | view::stride(s1); 更新 在谷歌搜索了一段时间后,我认为现在唯一可用的选择是,您必须在视图::xxx_中“混合”逻辑,而或任何带有可变lambda的可预测视图或

简单地说,我如何在
视图
链构造上进行编程分支

因为现在我能想到的只是
#if
,这不是一个好主意

auto adaptor =
   view::drop(x0)
#if branch1
   | view::drop(x1)
#elif branch2
   | view::filter(ft1)
#endif
   | view::stride(s1);

更新 在谷歌搜索了一段时间后,我认为现在唯一可用的选择是,您必须在
视图::xxx_中“混合”逻辑,而
或任何带有可变lambda的可预测视图或任何东西

然而,结果已经很好了

auto adaptor =
   view::drop(x0)
   | view::drop_while([captures](auto&&) mutable { ...blend it here... })
   | view::filter([captures](auto&&) mutable { ..blend it here... })
   | view::stride(s1);

无论如何,如果
view::enable\u如果
将来能提供一些方法,我认为代码看起来会比这更直接。

我建议不要这样做。代替此形位代码:

auto adaptor =
   view::drop(x0)
#if branch1
   | ranges::drop(x1)
#elif branch2
   | ranges::filter(ft1)
#endif
   | ranges::stride(s1);
您应该将该逻辑合并到过滤器中:

auto adaptor =
   view::drop(x0)
   | ranges::filter([](auto&& x){ return branch2 && ft1(x); })
   | ranges::stride(s1);

如果您真的想用一些编译时值组成一个范围适配器,您可以使用如下If语句:

auto get_adapter() {
    if constexpr(branch1)
        return view::drop(x0) | ranges::drop(x1) | ranges::stride(s1);
    else if constexpr (branch2)
        return view::drop(x0) | ranges::filter(ft1) | ranges::stride(s1);
    else
        return view::drop(x0) | ranges::stride(s1);
}

我很难理解你的确切意思。你能举个例子吗?@Fureeish有点太难看了,一开始就说不上来。抱歉。鉴于Y视图是懒惰的,它们的声明不应该引入任何性能影响。在这种情况下,使用普通的
if
s有什么错?只需
auto-rng=prev |…
等等。范围不太适合这样的分支。它们很轻,可以制作很多。未使用的通常不应占用太多(有时甚至任何)空间。@fureish希望应该有
视图::启用\u如果
:-)这些条件是常量表达式吗?我解决了我的问题。我只想在一个条件下删除一些,并在另一个条件下过滤?您假设
ft1
没有副作用