Я строю простой планировщик, который принимает функции как параметр, помещает их в очередь и выполняет их позже. Класс должен быть 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
так что фактические расчеты сделаны.
Как вы определяете «соответствующий метод»? Чем он отличается от ненадлежащего? Почему «Планировщик» должен знать, какой класс извлекается из него? Можете ли вы показать код, демонстрирующий, что выглядит «Планировщик», и как он предназначен для использования? –
@IgorTandetnik, я пытался наметить свою цель больше, чем реализацию. Я добавил свой подход выше, но вполне возможно, что другая архитектура, например. композиции, будет лучше соответствовать задаче. – Vorac
Технически вы можете использовать 'std :: function', что является идеальной абстракцией для действия. Вставьте элементы с помощью ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind) или [lambdas] (http://en.cppreference.com/w/cpp/язык/лямбда). Ваши lambdas могли бы содержать побочные эффекты, как назначение значения где-нибудь или вызов методов других объектов –