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
没有副作用