【问题标题】:How to store a type as member?如何将类型存储为成员?
【发布时间】: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,我试图概述我的目标而不是实现。我在上面添加了我的方法,但是完全有可能使用另一种架构,例如作文,更适合这项任务。
  • 从技术上讲,您可以使用std::function&lt;void()&gt;,这是一个动作的完美抽象。插入带有std::bindlambdas 的项目。您的 lambda 表达式可能包含副作用,例如在某处分配值或调用其他对象的方法
  • @DmitryLedentsov,这种方法听起来很棒。然而,事实证明我使用的是quite an old compiler
  • @DmitryLedentsov,非常感谢。我使用了std::function,效果很好。

标签: pointers c++11 types


【解决方案1】:

您正在搜索的是代表。由于您不想使用 boost 或其他提到的委托实现,您可以试试这个。

SomeObject obj;
delegate d = delegate::from_member<SomeObject, 
              &SomeObject::someMethod>(&obj);

您的调度程序应该在您的向量中使用委托对象。 看看这里:http://www.codeproject.com/Articles/11015/The-Impossibly-Fast-C-Delegates

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多