如何链接范围::有条件地查看
How to chain ranges::view conditionally?
简单地说,如何在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 或其他任何东西的可预测视图中。
然而,事实证明已经很糟糕了。
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);
}
相关文章:
- 如何使用 soong 命名空间来有条件地编译模块
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 根据模板类型有条件地删除变量
- 有条件地选择带有 decltype() 和三元运算符的类型
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 有条件的打印和计数在 std::map 上有限制
- 如何在 c++ 中有条件地包含标头?
- 如何仅在Qt是用ltcg构建时才有条件地启用ltcg?
- 如何在Visual Studio 2019中有条件地编译c++源文件
- C++可以有条件地向下转换类指针吗
- 使用 SFINAE 有条件地解析分配器成员
- 有条件地删除宏
- 有条件地包含C++标准库
- 如何有条件地将元素添加到 std::array - C++11
- 是否根据编译器版本有条件地包含源文件
- 有条件地启用类C++构造函数
- 我可以有条件地使用多个参数吗?
- 有条件地使用 Boost Python 添加模块
- 如何链接范围::有条件地查看
- 在不更改成员范围的情况下有条件地启用静态成员