Mar 6, 2008

我的 virtual constructor

今晚突發奇想,寫出了一段自以為了不起的程式……

首先我有一個base class:

class sdBase
{
public:
sdBase();
virtual ~sdBase() = 0;
};

加上一堆繼承它的class:

class A : public sdBase;
class B : public sdBase;
class C : public sdBase;
class D : public sdBase;

一開始的virtual constuctor長成這個樣子:

sdBase* VirtualCtor(int iType)
{
switch (iType)
{
case 0:
return new A();
case 1:
return new B();
......
}
}

一個很明顯的問題是:當新的類別越來越多時,這個switch就會影響到效能。所以我打算建一個constructor的array,於是……

template <class B, class T>
inline B* VirtualConstructor() { return new T(); }

typedef sdBase* (*VCtor)();

static const VCtor rgCtor[] =
{
VirtualConstructor < sdBase, A>,
VirtualConstructor < sdBase, B>,
VirtualConstructor < sdBase, C>,
VirtualConstructor < sdBase, D>,
VirtualConstructor < sdBase, E>,
VirtualConstructor < sdBase, F>,
......
};

最後:

sdBase* VirtualCtor(int idType)
{
return rgCtor[idType]();
}

現在新版的虛擬建構子以常數時間來搜尋真正的建構子了!
(一些有的沒的檢查請自行想像)

No comments: