C++如何写出CPS风格的代码

网站建设知识 phpacg 2年前 (2018-04-24) 166次浏览 0个评论

用上电脑,才明白题主的意图在于如何运用continuation。前面跟小v的讨论有些文不对题,仅供参考。

我以为contination的作用在于提升了代码笼统层次,从而愈加灵敏方便组织代码,降低了代码间的耦合,保证底层代码的纯真性,提高了基础代码的鲁棒性,可重用性。在实践运用中,continuation普通表现为closure和coroutine,前者是数据笼统的角度的运用,后者是运转层面的运用。

关于closure,从c++角度解释,复杂的可以相当于std::bind,复杂一些可以是一个lambda,目的是为了把其中数据的一些变化直接在调用者层面停止组织,从而底层被调用对象(假设有的话)就可以不触及到这些容易变化的局部。

关于coroutine,可以将两个或多个相互有逻辑关系的运转块,在一个集中的代码区块中描画,从而防止经过复杂的数据结构交互来调度它们,大大降低了此种情形下的代码复杂度,或许防止了无谓的线程调度及同步开支,愈加容易的对运转时发作的状况停止优化。

比如楼主给出代码是传统思想方式下的完成,是以参数传递的方式把变化(例子中sqrt函数)传递究竟层代码中去,这会使得底层代码变的复杂,不动摇,或许因无法做出过多的假定而难以优化。而continuation的方式,是要反过去来,就是把变化留在高层,或许说延迟到调用时辰代入,坚持底层的动摇性,不传递那些实质有关、或难以确定的参数。

比如,我会这么写

float add(float a, float b) {

return f(a+b);

}

…..

float j = add(sqrt(5), sqrt(4));

假设不是sqrt,就换成其他,这就够了。当然楼主的例子太复杂,这里尚未用到continuation。

稍微复杂些的,被调用代码曾经是定型了的,比如add就是原本的

float add(float a, float b, func)

方式,这个时分可以用小v答案lambda代入的方式就地结构所需的func,比事前不知情的时分写好各种func要省事准确的多。

在面向对象编程中罕见的一种情形是底层通用代码和用户代码解耦,回调函数没有用户类信息,沾合时需求转换甚至组合,这个时分经过闭包就方便很多。

我在写低耦合方式的代码,比如运用signal-slot这种方式编程时(传递函数指针是其一种特殊方式),由于调用者和被调用者是针对各自范围假定的完成,往往需求很多参数的适配,采用lambda可以大大简化这个适配进程,防止代码层次收缩。

在运转层面上,一个最复杂的例子是可以把continuation变成一个线程,这样可以写如下方式的代码:async_run(continuation)。对比传统thread调用用一个参数指针传递上下文,这同时也是一个闭包。

更多运用场景就暂不引见了,总体上需求笼统的东西具有变化需求,或许十分复杂的因果关系,你就自然会觉失掉其用武之地了,只用来写一些复杂的lambda函数是远远不够的。

喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址