browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

我的 template 历程

Posted by on 2009 年 08 月 11 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

2004 年我初学 C++ 的时候,便接触了“泛型编程”(Generic Programming)这个概念。我一个菜鸟,也没那么深究其理,只大概了解了这是个 template 相关的技术,仅此而已。
在实际的开发中,我逐渐需要使用类似链表或向量这样的容器,与 STL 邂逅之后,我开始为 template 这种“以不变应万变”的特性所倾倒了。
2005 年,我成为了一名职业 C/C++ 程序员。不过,template 却与我渐行渐远。原因也很简单,我所工作的环境是一个对编译器和内存要求都十分苛刻的环境,模板这种东西实难施展它的拳脚。现试举一二例,与诸君共飨之。

  • 在 Symbian 系统之中,它最著名(恐怕也是最为臭名昭著)的特色就是它那极有限的栈空间,于是程序员便不得不把本可由栈完成的工作强行交给堆。为了代码的易读与优美,一种名为“瘦模板”的机制横空出世,使得 Symbian 之中放眼望去遍是尖括号而非中括号。同时,Symbian 对 template 的支持又是十分有限的,所以“瘦模板”也因此而饱受正统的 C++ 程序员非议。
  • 当然,瘦模板再瘦也是模板,总比没有强。不过,还有些系统的条件比 Symbian 更为恶劣,所以这些系统的编译器连模板都不支持,比如 Nucleaus 的某衍生系统。
  • 相对上面的两者,Windows Mobile 对模板的支持可以说是相当值得称赞了。而且,无论是 eVC 还是 Visual Studio 2005/2008,都附带了一份用于 Windows Mobile 的 STL。这实在是个好消息,但如果要编写平台无关的代码的话,就必须忍痛割爱,只能认为 Windows Mobile 之中的模板特性不存在了。

另外,由于 template 的实例化会产生更多的二进制代码,而这显然不适用于苛刻的嵌入式环境,于是在我的工作领域,template 是被完全禁止的。当然,我自己的习惯也深受影响,甚至到今天,我还保留着自己实现容器的习惯,而且这些容器的元素都是无类型的指针,可以说是另一种“以不变应万变”的解决方案。
不过,我对 template 的接触并没有就此停止。我先后于 2006 年和今年分别购买了《Imperfect C++》和《C++ Templates》两本书,开始发现 template 的妙处绝不仅仅是一个“泛型”就能概括的了的。此个中妙处,恐非亲身体验者不能言也。
如果说在理想的状态下,所有的 C++ 编译器都提供了对 template 完美支持,那会是什么样子呢?
我仍然持保留意见,因为高超的技巧往往会带来一定的门槛。——如果把“绚烂多彩”换一个说法,就有可能变成“眼花缭乱”了。在当今中国的 IT 产业中,我们的开发团队并不是相对稳定的团队,团队中的成员更不是拥有相同能力的程序员,因此 template 带来的泛型和模板元便不可避免地成为了“阳春白雪”,和之者甚少。当技术融入团队的时候,要让步的不应该是团队,而应该是技术。作为一个团队的负责人,他不应该让阳春白雪的代码出现在任何一个成员的手下,更不应该让这样的代码流传下去,成为一颗无人敢碰的炭球。
我虽爱 template,但其窘境如此,亦不可无视之。

订阅本站

4 Comments

  • At 2009.08.11 14:25, bzero1982 said:

    沙发.
    利用 template, C++基本可以实现任何技巧。

    • At 2009.08.13 15:05, asia123 said:

      对模板代码深恶痛觉。

      • At 2009.08.13 16:30, QSlash said:

        B S即想要贯彻强类型,又要尽量方便重用,那么模版就是他必然的选择

        • At 2009.08.18 20:19, likunkun said:

          用模板要保持好的可读性,不过还是要有个度…

          不懂模板的人,不招
          :p

          (Required)
          (Required, will not be published)