gpt4 book ai didi

c++ - 如何有条件地链接 ranges::view?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:31 26 4
gpt4 key购买 nike

简单地说,我如何以编程方式在 view 链构造上分支?

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

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

已更新

谷歌搜索一段时间后,我认为现在唯一可用的选择是您必须将逻辑“混合”到 view::xxx_while 或任何具有可变 lambda 的可预测 View 或其他。

然而,结果已经很好了。

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_if 将来可以使用某些方式,我认为代码看起来会比这更直接。

最佳答案

我建议不要这样做。而不是这个假设的代码:

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);
}

关于c++ - 如何有条件地链接 ranges::view?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57046767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com