快速业务通道

C++箴言:谨慎使用模板元编程

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
;n> 引用 template instantiation(模板实例化)Factorial<n-1> 的地方。就像所有正确的 recursion(递归)有一个导致递归结束的特殊情况。这里,它就是 template specialization(模板特化)Factorial<0>。

Factorial template 的每一个 instantiation(实例化)都是一个 struct,而每一个 struct 都使用 enum hack声明了一个名为 value 的 TMP 变量。value 用于持有阶乘计算的当前值。如果 TMP 有一个真正的循环结构,value 会在每次循环时更新。因为 TMP 在循环的位置使用 recursive template instantiation(递归模板实例化),每一个 instantiation(实例化)得到它自己的 value 的拷贝,而每一个拷贝拥有适合于它在“循环”中所处的位置的值。

你可以像这样使用 Factorial:

int main()
{
std::cout << Factorial<5>::value; // prints 120
std::cout << Factorial<10>::value; // prints 3628800
}

如果你觉得这比吃了冰淇淋还凉快,你就具有了一个 template metaprogrammer(模板元程序员)应有的素质。如果 templates(模板)以及 specializations(特化)以及 recursive instantiations(递归实例化)以及 enum hacks 以及对类似 Factorial<n-1>::value 这样的类型的需要使你毛骨悚然,好吧,你是一个不错的常规 C++ 程序员。

当然,Factorial 示范的 TMP 的效用大约就像 "hello world" 示范的任何常规编程语言的效用一样。为了领会为什么 TMP 值得了解,更好地理解它能做什么是很重要的。这里是三个示例:

Ensuring dimensional unit correctness(确保计量单位正确性)。在科学和工程应用中,计量单位(例如,质量,距离,时间,等等)被正确组合是基础。例如,将一个代表质量的变量赋值给一个代表速度的变量是一个错误,但是用一个时间变量去除距离变量并将结果赋给一个速度变量就是正确的。使用 TMP,不论计算多么复杂,确保(在编译期间)一个程序中所有计量单位组合都是正确的是有可能的。(这是一个如何用 TMP 进行早期错误诊断的例子。)这个 TMP 的使用的一个有趣的方面是能够支持分数指数。这需要这个分数在编译期间被简化以便于编译期能够确认,例如,单位 time1/2 与单位 time4/8 是相同的。

Optimizing matrix operations(优化矩阵操作)。《C++箴言:必须返回对象时别返回引用》中阐释了一些函数,包括 operator*,必须返回新的 objects,而《C++箴言:从模板中分离出参数无关的代码》一文中则引入了 SquareMatrix class,所以考虑如下代码:

typedef SquareMatrix<double, 10000> BigMatrix;
BigMatrix m1, m2, m3, m4, m5; // create matrices and
... // give them values
BigMatrix result = m1 * m2 * m3 * m4 * m5; // compute their product

用“常规”方法计算 result 需要四个临时矩阵的创建,用于每一次调用 operator* 的结果。此外,独立的乘法产生了一个四次循环遍历矩阵元素的序列。使用一种与 TMP 相关的被称为 expression templates(表达式模板)的高级模板技术,完全不改变上面的客户代码的语法,而消除临时对象以及合并循环是有可能的。最终的软件使用更少的内存而且运行速度戏剧性地更快。

Generating custom design pattern implementations(生成自定义的设计模式实现)。像 Strategy(参见《C++箴言:考虑可选的虚拟函数的替代方法》),Observer,Visitor 等设计模式能用很多方法实现。使用一种被称为 policy-based design(基于 policy 设计)的 TMP-based(基于 TMP)的技术,使得创建代表独立的设计选择的 templates ("policies") 成为可能,这种 templates 能以任意的方法组合以产

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号