大佬教程收集整理的这篇文章主要介绍了c – 为什么我可以选择* not *在运行中调用Concurrency :: agent :: done?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
有一个叫做agent的类(在Concurrency namespace下),它基本上是你派生并实现纯虚拟代理:: run的状态机.
现在,您有责任调用agent :: start,这将使其处于可运行状态.然后,您可以调用agent :: wait *或其任何变体来实际执行agent :: run方法.
但为什么我们必须在体内调用agent :: done?我的意思是,明显的答案是agent :: wait *会等到完成信号或超时已经过去,但……
设计师有什么打算?当agent :: run返回时,为什么不让代理进入完成状态?这就是我想知道的.为什么我可以选择不调用完成?如果超时已过,则等待方法会抛出异常.
现在,他们可以做到这一点:
private: void agent::do_run() { run(); if (status() != agent_donE) done(); }
然后让他们的框架直接调用do_run()而不是run()(或等效的).
但是,你会注意到你自己可以做到这一点.
class myagent: public agent { protected: virtual void run() final override { /* see do_run above,except call do_run in it */ } virtual void do_run() = 0; };
和poof,如果你的do_run()无法调用done(),包装函数会为你做.如果第二个虚函数开销对您来说太高:
template<typename T> class myagent: public agent { private: void call_do_run() { static_cast<T*>(this)->do_run(); } protected: virtual void run() final override { /* see do_run above,but call_do_run() */ } };
CRTP,它允许您进行编译时调度.使用:
class foo: public myagent<foo> { public: void do_run() { /* code */ } };
…… /耸肩
以上是大佬教程为你收集整理的c – 为什么我可以选择* not *在运行中调用Concurrency :: agent :: done?全部内容,希望文章能够帮你解决c – 为什么我可以选择* not *在运行中调用Concurrency :: agent :: done?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。