Зачем вообще использовать T * вместо boost::function<void ()>
?
Таким образом, вы можете использовать бесплатные функции, а также функции-члены, и вы можете упростить свой код.
Задача для члена в экземпляре класса X может быть поставлена в очередь следующим образом:
poll.add(boost::bind(&X::member, x_instance, other_arguments));
В вашем коде нет приведений и шаблонов.
Обновление:
Используйте boost :: function вместо вашего класса Task. Затем вам просто нужно отслеживать экземпляры и вызывать их по мере необходимости. Например:
class TaskQueue {
std::deque<boost::function<void ()> > m_tasks;
public:
void add(boost::function<void ()> const& f) { m_tasks.push_back(f); }
bool has_task() const { return !m_tasks.empty(); }
void do_task() {
m_tasks.front()();
m_tasks.pop_front();
}
};
int example_enqueue(TaskQueue* tq) {
boost::shared_ptr<RandomClass> rc(new RandomClass);
tq->add(boost::bind(&RandomClass::method, rc, arg_1, arg_whatever));
}
Обратите внимание, что, комбинируя этот метод с boost :: shared_ptr, вы получаете автоматическое уничтожение ваших объектов, когда функция выходит из области видимости, если это последняя ссылка. Это делает жизнь намного проще.