我能看到的唯一原因是它会让你声明你是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;
};
和噗,如果你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 */ }
};
... /耸耸肩