条款48:认识template元编程

条款48:认识template元编程
    Be aware of template metaprogramming.

    Template metaprogramming(TMPS,模板元编程)是编写template-based C++程序并执行编译期的过程.它本
质上是以C++写成、执行于C++编译器内的程序.一旦TMP程序结束执行,其输出,也就是从templates具现出来的若
干C++源码,便会一如往常地被编译.TMP有两个伟大的效力.第一,它让某些事情更容易.如果没有它,那些事情将
是困难,甚至不可能.第二,欲与TMP执行于C++编译期,因此可将工作从运行期转移到编译期.这导致一个结果是,
某些错误原本通常在运行期才能检测到,现在可在编译期找出来.这样带来的结果是很美好的.因为使用TMP的C++
程序可能在每一方面都更高效:较小的可执行文件、较短的运行期、较少的内存要求.然而它也会带来另一个令人
感到不愉快的结果是,编译时间变长了.
    前面一款我们提到了使用typeid的advance的伪代码实现版本:
    template <typename IterT, typename DistT>
    void advance( IterT& iter, DistT d )
    {
        if( typeid( typename std::iterator_traits<IterT>::iterator_category )
            == typeid( std::random_access_iterator_tag ) ){
            iter += d;
        } else {
            if( d >= 0 ){
                while( d-- ){
                    ++iter;
                }
            } else {
                while( d++ ){
                    --iter;
                }
            }
        }
    }
    上一条款中我曾提过advance的typeid-based实现方式可能导致编译期问题,我们现在就写出如下代码测试:
    std::list<int>::iterator iter;
    ...
    advance( iter, 10 ); //compile error:error C2676: binary '+=' : 'std::list<_Ty>::
    //_Iterator<_Secure_validation>' does not define this operator or a conversion to
    //a type acceptable to the predefined operator.
    上述错误信息显示的是iter += d;由于这行代码导致的.这怎么可能?list<int>::iterator是bidirectional
迭代器,并不支持+=,只有random access迭代器才支持,此刻我们知道编译器绝对不会执行+=那一行代码的,因为
测试typeid那行的if语句总是不成立.你开始郁闷了吧?我在这里要说的是:在用TMP编写的C++程序中,编译器必须
确保所有源码都有效,纵使是不会执行的代码.晕,原来还有这样的啊,其实你仔细想一想,这样做也是可以理解的:
TMP程序被具现化以后发生在编译期,编译器必须依靠执行的具现化代码才能确定哪些语句能执行到,为了对所有可
能的具现化代码编译的支持,编译器也只能这样做!葛大爷在他的一部影片中说了一句:'有枣没枣打一杆,宁可错杀
一千,不愿放走一个.',要是用在这里的话也有一定的道理,呵呵.
    为求领悟TMP之所以值得学习,很重要一点是先对它能够表达的目标有一个比较好的理解,原书上对下面的每一
个点都举了例子进行阐述,我对这些阐述还没有理解的足够的深刻,所以在这里我也不敢误人子弟地阐述自己的理解
.我只帖出来原书上出现的三个TMP运用的例子,具体的阐述过程,我建议各位还是看原书上的阐述吧!这三个例子为:
    ■ 确保度量单位正确.
    ■ 优化矩阵运算.
    ■ 可以生成客户定制之设计模式实现品.
    TMP或许永远不会成为主流,但对某些程序员--特别是程序库开发人员---几乎确定成为他们的主要粮食.
    请记住:
    ■ TMP可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率.
    ■ TMP可别用来生成'基于政策选择组合'的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码.

 

 


   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值