未知のクラスの関数を実行できるスレッドプールを作成しようとしています。非会員を代理人として作成する必要はありません。ワーキングプールと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のクラスを決定します。しかし、私は未知のクラスタイプのメンバーを呼び出すことができるようにしたいと思います。私は無効なptrを検討しましたが、これを有効なインスタンスptrに変換する方法を見つけることができませんでした。私もboost::mem_funを調べましたが、実際にそれを理解するのに苦労しました。
私はC++0xについて簡単に読んだことがあり、私が理解していることから、問題の解決が容易になるはずですが、可能であれば、その前にこれを解決したいと思います。