C++ push-pipeline如何实现3个及以上multi-functors的优雅链式调用?
C++ 推式管道(push-pipeline)多函数对象链式调用问题
问题背景
开发C++推式管道功能时遇到核心疑问:能否用类似管道的优雅|语法,串联3个及以上的多函数对象(multi-functors)?
问题代码表现
现有基础实现仅支持两个过滤器的链式调用,3个及以上链式调用会失败,无论是否加括号都无法达到预期:加括号时期望(filter1 | filter0)返回一个可调用的函数对象,不加括号时期望filter2 | filter1返回一个偏函数。
问题代码如下:
struct Filter0{// 多函数对象,作为管道最后一级 template<Args...args> void operator()(Args&&...args){/* 内部逻辑不影响问题复现 */} }; template<std::invocable F> struct Filter1{// 中间过滤器,负责向下游多函数对象转发参数 template<Args...args> void operator()(F&f, Args&&...args){ /* 执行自定义逻辑,符合条件时调用下游 f(std::forward<decltype(args)>(args)...) */ } }; template<typename Left, std::invocable Right> auto operator|(Left left, Right right){// 实现两个可调用对象的管道串联 return [left,right](auto&& arg){ left(right, std::forward<decltype(arg)>(arg)); }; } Filter0 filter0; Filter1<decltype(Filter0)> filter1; auto pipe1 = filter1 | filter0;// 双过滤器链式调用正常 pipe1('x');// 正常执行,将'x'传入管道处理 Filter2<decltype(Filter1)> filter2;// Filter2结构与Filter1类似 auto pipe2 = filter2 | (filter1 | filter0);// 三过滤器链式调用失败 pipe2('x');// 执行报错
现有备选实现的缺陷
目前可以通过将下一级过滤器作为构造函数参数传入中间过滤器并存储为类成员的方式实现3个及以上过滤器的串联,代码如下:
Filter0 filter0; Filter1 filter1(filter0); Filter2 filter2(filter1); filter2('x');// 可正常将'x'传入管道执行
但这种实现方式下过滤器在声明阶段就互相强绑定,不符合松耦合需求,期望各个过滤器尽可能独立,最好仅通过类型绑定甚至完全无绑定。
可行解决方案
- 方案1(简单易实现):将过滤器类的模板参数移到方法层
- 方案2(灵活性更高):将
filter|filter操作实现为表达式模板
内容的提问来源于stack exchange,提问作者Solo
相关产品推荐
相关产品推荐

