我正在构建一个简单的调度程序,它将函数作为参数,将它们放入队列中并稍后执行它们。该类的目的是 inherited ,然后从子类的方法中调用 enqueue(function_ptr)
。
我的问题是调度将根据时间进行,并且是通过 2ms 中断来测量的。人们可以从中断处理程序订阅回调,但这些回调仅向订阅的对象返回一个 void*
。
那么我如何知道传回的对象的类型是什么,以便我可以转换它并调用适当的方法?
我在创建class Scheduler
时考虑了模板参数,但是回调函数不知道模板参数是什么。因此,也许可以通过某种方式将 Scheduler
的子类存储在成员变量中 - 将 object
转换为 Scheduler
并查看该字段,将其转换为最终类型?我想这可以通过可调度类的全局枚举来解决,但这似乎是一个糟糕的解决方案。
或者也许我的整个方法是错误的?
<小时/>这里是调度程序的一些代码。我没有发帖,因为可能我的整个方法都是错误的。
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
来执行,以便进行实际计算。
最佳答案
您正在寻找的是代表。由于您不想使用 boost 或其他提到的委托(delegate)实现,您可以尝试这样做。
SomeObject obj;
delegate d = delegate::from_member<SomeObject,
&SomeObject::someMethod>(&obj);
您的调度程序应在向量中使用委托(delegate)对象。 看看这里:http://www.codeproject.com/Articles/11015/The-Impossibly-Fast-C-Delegates
关于pointers - 如何将类型存储为成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26892595/