[英]Complicate class for storing and calling a pointer to the static or member void function
[英]Storing and later calling member function of unknown class
我正在尝试创建一个可以运行未知类的函数的线程池。 我不希望创建非成员作为代理。 我设法创建了一个工作池和workerthread类和一个任务结构,所有这些都是模板。
// ThreadPool.h
/* Threadpool creates N WorkerThreads (each worker has a ptr to the creating pool),
these block until a task is ready then call ThreadPool::doTask() */
template<class T>
struct Task {
Task() : func(0), inst(0) { }
Task(boost::function<void(T*)> function, T* instance) : func(0), inst(0) {
func = function;
inst = instance;
}
void operator()() {
Task::func(inst);
}
T* inst;
boost::function<void(T*)> func;
};
template<class T>
class ThreadPool {
template<class T> friend class WorkerThread;
public:
void addTask(Task<T> task) {
... // Some stuff
}
bool doTask() {
Task<T> task;
... // Gets a task from std::queue
// Check the task actually exists!
if(task.func && task.inst) {
// Do the task
(task)();
}
}
private:
std::queue<Task<T>> mTasks;
};
这样,这段代码可以工作,只要我确定ThreadPool和Task的类。 但我希望能够调用未知类类型的成员。 我曾考虑过一个void ptr,但我找不到将其转换为有效实例ptr的方法。 我也研究了boost :: mem_fun,但很难真正掌握它。
我简要地阅读了关于C ++ 0x的内容,根据我的理解,它应该能够更轻松地解决我的问题,但我想在此之前解决这个问题,如果可能的话。
为什么要使用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结合使用,当函数超出范围时,如果它是最后一个引用,则会自动销毁对象。 这让生活变得更轻松。
无效*会起作用。 你只需要做一个强大的reinterpret_cast
。 但我不会使用这个解决方案。 Boost有许多创建仿函数对象的方法: http : //www.boost.org/doc/libs/1_46_1/doc/html/function.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.