今晚突發奇想,寫出了一段自以為了不起的程式……
首先我有一個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]();
}
現在新版的虛擬建構子以常數時間來搜尋真正的建構子了!
(一些有的沒的檢查請自行想像)
Mar 6, 2008
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment