CG@CPPBLOG

/*=========================================*/
随笔 - 76, 文章 - 39, 评论 - 137, 引用 - 0
数据加载中……

《C++设计新思维》读书笔记(16)


3. Typelists

Typelists是一个用来操作一大群型别的C++工具。就像lists对数值提供各种基本操作一样,typelists对型别也提供相同操作。

有些设计模式具体指定并操作一群型别,其中也许有继承关系(但也许没有)。显著的例子是abstract factory和visitor。如果以传统编程技术来操作一大群型别,将是全然的重复工作。如此重复会导致隐微的代码膨胀。多数人不会想到其实它可以比现在更好。Typelists带给你一种能力,可以将经常性的宏工作自动化。Typelists将来自外星球的强大威力带到C++中,让它得以支持新而有趣的一些手法。

3.1 Typelists的必要性

有时候你必须针对某些型别重复撰写相同代码,而templates无法帮上忙。假如有一个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,而是任意型别。怎么办?

如果你不试图泛化基本概念,就不太有机会泛化这些概念的具象实体。虽然抽象基类很简单,但是你会陷入无穷无尽的派生类生成器中。

我们希望能够这样去使用一个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 }


实际这是不可能的,如果Create不是虚函数,那么你就陷入了长长的Switch...case...之中,如果它是虚函数,那么虚函数不能是模板。
Typelists将使Abstract Factories泛化成真,并带来更多其它利益。

posted on 2007-12-29 22:05 cuigang 阅读(352) 评论(0)  编辑 收藏 引用 所属分类: 《C++设计新思维》读书笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理