C++模板的魅力和魔力

本文要解決的問題很好描述,但要想取個對應的標題還真不容易。

任務描述:假設我有一個邏輯線程,這個線程專門用來處理 各種類成員函數的調用。

要求:類類型不限,類成員函數參數類型可以任意。

首先爲這些成員函數定義一個基類

class Task

{

public:

virtual void Run() = 0;

};

其次,抽象出各類的成員函數參數類型,下面以一個參數爲例

template <class T,class Method,class A>

class Task1 : public Task

{

private:

T* obj;  Method method;  A arg;

public:

Task1(T* t, Method m, const A &a){ obj = t;  method = m;  arg = a; }

protected:

virtual void Run(){ (obj->*method)(arg); }

};

爲了方便線程操作,再抽象出一個專用的函數

template <class T,class Method,class A>

Task* NewTask(T* t,Method m,A &a)

{

return new Task1<T,Method,A>(t, m, a);

}

如何在線程中應用呢?這個很簡單,在線程中定義一個deque,每次調用NewTask函數往隊列中插入一個Task,線程函數每次從deque中取出一個Task然後執行其Run方法即可。

下面做一個簡單的測試(不是線程)

class JTest
{
public:
void f1(int c)
{
cout<<"arg: "<<c<<endl;
}
void test()
{
int c = 5;
Task* t = NewTask(this, &JTest::f1, c);
t->Run();
delete t;
}
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章