3. Typelists
Typelists是一個(gè)用來(lái)操作一大群型別的C++工具。就像lists對(duì)數(shù)值提供各種基本操作一樣,typelists對(duì)型別也提供相同操作。
有些設(shè)計(jì)模式具體指定并操作一群型別,其中也許有繼承關(guān)系(但也許沒(méi)有)。顯著的例子是abstract factory和visitor。如果以傳統(tǒng)編程技術(shù)來(lái)操作一大群型別,將是全然的重復(fù)工作。如此重復(fù)會(huì)導(dǎo)致隱微的代碼膨脹。多數(shù)人不會(huì)想到其實(shí)它可以比現(xiàn)在更好。Typelists帶給你一種能力,可以將經(jīng)常性的宏工作自動(dòng)化。Typelists將來(lái)自外星球的強(qiáng)大威力帶到C++中,讓它得以支持新而有趣的一些手法。
3.1 Typelists的必要性
有時(shí)候你必須針對(duì)某些型別重復(fù)撰寫(xiě)相同代碼,而templates無(wú)法幫上忙。假如有一個(gè)abstract factory,像這樣:
1 class WidgetFactory
2 {
3 public:
4 virtual Window* CreateWindow() = 0;
5 virtual Button* CreateButton() = 0;
6 virtual ScrollBar* CreateScrollBar() = 0;
7 };
如果你想將Abstract Factory概念泛化,不只生成Window、Button、ScrollBar,而是任意型別。怎么辦?
如果你不試圖泛化基本概念,就不太有機(jī)會(huì)泛化這些概念的具象實(shí)體。雖然抽象基類(lèi)很簡(jiǎn)單,但是你會(huì)陷入無(wú)窮無(wú)盡的派生類(lèi)生成器中。
我們希望能夠這樣去使用一個(gè)abstract factory:
1
2 template <class T>
3 T* MakeRedWidget(WidgetFactory& factory)
4 {
5 T* pW = factory.Create<T>();
6 pW -> SetColor(RED);
7 return pW;
8 }
實(shí)際這是不可能的,如果Create不是虛函數(shù),那么你就陷入了長(zhǎng)長(zhǎng)的Switch...case...之中,如果它是虛函數(shù),那么虛函數(shù)不能是模板。
Typelists將使Abstract Factories泛化成真,并帶來(lái)更多其它利益。