这是在Microsoft C ++ Concurrency API的上下文中。
有一个名为agent
的类(在Concurrency
命名空间下),它基本上是您派生并实现纯虚拟agent::run
的状态机。
现在,您有责任致电agent::start
,这会将其置于 runnable 状态。然后,您可以调用agent::wait
*或其任何变体来实际执行agent::run
方法。
但为什么我们必须在身体内召唤agent::done
?我的意思是,显而易见的答案是agent::wait
*将等到完成信号或超时已经过去,但是......
设计师有什么打算?当agent::run
返回时,为什么不让代理进入完成状态?这就是我想知道的。为什么我可以选择不拨打done
?如果超时已经过去,则wait方法会抛出异常。
答案 0 :(得分:2)
关于我能看到的唯一原因是,它会让你说你是done()
,然后做更多的工作(比如清理)你不希望你的消费者不得不等待。
现在,他们可以做到这一点:
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 */ }
};
... /耸肩