组合函数

组合函数是将N个一元函数组成一种更复杂的函数,每个函数的返回值作为参数传给下一个函数,直到传到最后一个函数结束。这种组合函数的能力可以使我们以一种更直观的方式去完成复杂的链式执行行为。例如有三个函数:

这种方式在使用起来不够简洁方便,如果能把这些简单函数组合起来,就可以按简单函数的方式去调用了,更加直观和简洁。比如像这样调用:

这种方式把这些函数串在一起了,内部是一个接一个调用并得到最终结果。

在c++中如何实现这种组合函数的调用呢?想想我们应该怎么做吧。我们先分析一下这种组合函数的调用的特点:

  • 都是一元函数;因为返回值要做下个函数的入参,返回值只有一个结果。
  • 一元函数的入参和返回值都是同一种类型;因为返回值要做下个函数的入参。
  • 按顺序从前往后调用。

通过上面的分析我们知道这种组合函数有个隐含的约束就是,返回值和入参必须相同,这也导致这些函数只能是一元函数。
如果希望有多个入参,则要通过变通的方式了,比如可以将一个结构体作为入参,类似于data_struct f(data_struct)来实现多个入参的问题。

好了现在看看c++中是如何实现这种调用的吧。

测试代码:

对于compose那里之前的代码在gcc下编译不过的问题做一个说明(Normandie反馈过这个问题,在此表示感谢),原因是因为GCC和vs2013对于变参的展开规则不太一样导致的,GCC的展开规则更严格。

《组合函数》有4个想法

  1. {
    return Compose(Compose(std::forward(f1), std::forward(f2)), std::forward(f3), std::forward(fs)…);
    }
    这一句怎么工作的没看懂,分解一下呢

  2. 第一个Compose(std::forward(f1), std::forward(f2))会返回一个可调用对象,假设这个返回的可调用对象为x;
    第二个Compose就变成了Compose(x, f3, fs…);然后就会递归调用Compose了,最终在Composed Compose(F1&& f1, F2&& f2)这里终止递归,完成调用。

  3. 组合函数无疑是必要的,这里不做讨论了。
    但是我很讨厌由于模块的限制(相对于宏来说)带来的很多的技巧,能不能做一个库或者干脆做一个代码生成器让菜鸟们可以直接享受简明代码的乐趣,而不用深入到语言的复杂细节。
    当然,也许我提得太高,现实的办法还是搞懂C++标准,多找一些大神的库和实现看看,可能是最快的应用方式。

发表评论