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)
我不确定你所使用的解决方案有多轻量级,但是std :: async简化了future/promise对的设置,并允许调用者决定是否由另一个线程异步执行工作,或者延迟在同一个线程中执行.在任何情况下,调用者都不必进行任何显式线程管理.
有几个原因我认为你要求的东西在C++中几乎是不可能的.
首先,为了使用C++ 11的新内联函数声明的lambda语法(相当于JavaScript中的等效内容非常简单且非常轻松),您只需要使用模板来使用它们.
其次,与JavaScript不同,你没有自动的UI线程来保存你的计时器/完成队列,所以你几乎不得不求助于创建一个线程池来监视为执行它们做好准备的任务.下一步.
当你说"纯C++"和"轻量级"(并且隐式无线)时,你还有什么想法?
| 归档时间: |
|
| 查看次数: |
6516 次 |
| 最近记录: |