【发布时间】:2015-01-09 15:17:22
【问题描述】:
我正在构建一个简单的调度程序,它将函数作为参数,将它们放入队列中并在稍后执行它们。该类旨在为inherited,稍后将在子类的方法中调用enqueue(function_ptr)。
我的问题是调度将根据时间进行,并且以 2 毫秒的中断来衡量。可以从中断处理程序订阅回调,但这些回调只返回一个void* 到被订阅的对象。
那么我怎样才能知道被传回的对象的类型,以便我可以转换它并调用适当的方法呢?
我在class Scheduler 创建时考虑模板参数,但是回调函数不知道模板参数是什么。所以也许某种方式将Scheduler 的子类存储在成员变量中——将object 转换为Scheduler 并查看该字段,将其转换为最终类型?我想这可以通过可调度类的全局enum 来解决,但这似乎是一个糟糕的解决方案。
或者也许我的整个方法都是错误的?
这是调度程序的一些代码。我没有发帖,因为可能我的整个方法都是错误的。
class Scheduler {
private: std::vector<QueueItem> m_queue;
protected: void schedule(void *foo_ptr);
public: void callback_2ms_passed(); // Note that we are getting only 'this' as a parameter.
}
class Child1 : public Scheduler, public OtherClasses {
void slow_foo(bool execute_immediately = false) {
if(!execute_immediately)
schedule(slow_foo);
else
// Do slow stuff.
}
}
这个想法是调度程序决定稍后何时调用慢速函数,并使用参数true 执行此操作,以便进行实际计算。
【问题讨论】:
-
如何定义“合适的方法”?它与不合适的有什么区别?为什么
Scheduler需要知道从它派生的类是什么?您能否展示一些代码来演示Scheduler的外观以及它的用途? -
@IgorTandetnik,我试图概述我的目标而不是实现。我在上面添加了我的方法,但是完全有可能使用另一种架构,例如作文,更适合这项任务。
-
@DmitryLedentsov,这种方法听起来很棒。然而,事实证明我使用的是quite an old compiler。
-
@DmitryLedentsov,非常感谢。我使用了
std::function,效果很好。