C++中的延迟/承诺模式

Sha*_*ane 14 c++ design-patterns promise jquery-deferred

我最近发现并且爱上了jQuery中使用的Deferred/Promise模式.它只是封装了许多异步用例,包括精彩的链接,过滤能力,我不敢相信我错过了这么久.

我刚刚完成重构我的AS3代码以使用优秀的CodeCatalyst/promise-as3库(https://github.com/CodeCatalyst/promise-as3),所以开始考虑回到我的C++代码并看看我是如何可以在那里实施模式.

在我自己开始编码之前,我检查过它是否已经完成,并发现std::future/ std::promise(和提升等价物),但它们非常重(它们似乎使用真正的线程等,并且具有沉重的模板语法).

所以,我的问题是:是否存在deferred/Promise模式的轻量级纯C++实现,jQuery风格?

裁判:

Oz.*_*Oz. 11

很抱歉玩死灵法师,但我也非常感兴趣在C++中使用A +风格的承诺,并花了数年时间研究实现它的最佳方法.我最终成功了,你可以在这里看到我的实现.

用法很简单,但确实大量使用模板和模板元编程.这是一个例子:

Promise<int> promise;

promise.future().then([](int i){
    std::cout << "i = " << i << std::endl;
    return "foobar";
}).then([](const std::string& str){
    std::cout << "str = " << str << std::endl;
});

promise.resolve(10);
Run Code Online (Sandbox Code Playgroud)

这将打印出来:

i = 10
str = foobar
Run Code Online (Sandbox Code Playgroud)


jua*_*nza 8

我不确定你所使用的解决方案有多轻量级,但是std :: async简化了future/promise对的设置,并允许调用者决定是否由另一个线程异步执行工作,或者延迟在同一个线程中执行.在任何情况下,调用者都不必进行任何显式线程管理.

  • @Shane那么你可以在延迟执行模式下使用`std :: async`,但是每当你要求结果时这都会阻塞你的主线程. (4认同)

sbl*_*lom 6

有几个原因我认为你要求的东西在C++中几乎是不可能的.

首先,为了使用C++ 11的新内联函数声明的lambda语法(相当于JavaScript中的等效内容非常简单且非常轻松),您只需要使用模板来使用它们.

其次,与JavaScript不同,你没有自动的UI线程来保存你的计时器/完成队列,所以你几乎不得不求助于创建一个线程池来监视为执行它们做好准备的任务.下一步.

当你说"纯C++"和"轻量级"(并且隐式无线)时,你还有什么想法?

  • 将来某些其他方式可以获得结果的想法不应该依赖于一个线程.如果可能是任何操作,可能使用或不使用线程,例如文件I/O或手动轮询或其他任何操作.在一天结束时,它只是在设置Deferred时触发的回调链接列表. (2认同)