2014-11-12 2 views
3

Я строю простой планировщик, который принимает функции как параметр, помещает их в очередь и выполняет их позже. Класс должен быть 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 так что фактические расчеты сделаны.

+1

Как вы определяете «соответствующий метод»? Чем он отличается от ненадлежащего? Почему «Планировщик» должен знать, какой класс извлекается из него? Можете ли вы показать код, демонстрирующий, что выглядит «Планировщик», и как он предназначен для использования? –

+0

@IgorTandetnik, я пытался наметить свою цель больше, чем реализацию. Я добавил свой подход выше, но вполне возможно, что другая архитектура, например. композиции, будет лучше соответствовать задаче. – Vorac

+0

Технически вы можете использовать 'std :: function ', что является идеальной абстракцией для действия. Вставьте элементы с помощью ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind) или [lambdas] (http://en.cppreference.com/w/cpp/язык/лямбда). Ваши lambdas могли бы содержать побочные эффекты, как назначение значения где-нибудь или вызов методов других объектов –

ответ

0

Все, что вы ищите, являются делегатами. Поскольку вы не хотите использовать boost или другие упомянутые реализации делегатов, вы можете попробовать это.

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

Ваш планировщик должен использовать объекты-делегаты в вашем векторе. Обратите внимание: http://www.codeproject.com/Articles/11015/The-Impossibly-Fast-C-Delegates

Смежные вопросы