• Effective C++ 条款48 认识template元编程


    1. 模板元编程(template mataprogramming,TMP)是编写C++程序并执行于编译期的过程,"所谓template mataprogram(模板元程序),是以C++写成,执行于C++编译器内的程序.一旦TMP程序结束执行,其输出,也就是从templates具现出来的若干C++源码,便会一如往常地被编译".

    2. 自从templates加入C++,TMP底层特性便被引进了,自从TMP于1990s初期被发现,TMP被日渐证明十分有用.TMP有两个伟大效力:

        1). 它让某些事情变得更容易.

        2). template program执行于C++编译期的特性使得工作可以从编译期转移至执行期,这使得错误可以被提前检测,并产出具有较小可执行文件,较短运行期,较少内存需求的文件,代价就是编译时间变长了.

        条款47中的traits解法就是TMP,因为traits引发编译期发生于类型身上的if...else运算:用编译期的重载模板函数参数匹配行为代替执行期发生的if...else运算功能.

        TMP已经被证明是"图灵完全"的,使用TMP可以声明变量,执行循环,编写及调用函数......针对TMP设计的程序库(例如Boost's MPL)提供更高层次的语法."但这般构件相对于正常的C++对应物看起来很是不同,例如条款47展示的TMP if-else条件句是藉由templates及其特化体表现出来",另外一个例子是循环,TMP是的循环是藉由递归完成:

        用TMP实现一个计算阶乘的函数如下.

    template<unsigned n>
    struct Factorial{
        enum{value=n*Factiroal<n-1>::value;};
    }
    template<>
    struct Factorial<0>{
        enum{ value=1};
    }
    View Code

       正如以上所展示,TMP的递归并不涉及函数调用,而是递归模板具现化.

    3. TMP的重要应用:

        1) 确保量度单位正确

        2) 优化矩阵运算.

        3) 生成客户定制之设计模式实现品(如Strategy(条款35),Observer,Visitor等). 

      TMP当前也有其劣势:语法不直观,支持工具不充分,而且由于TMP是在一个相对短时间之前才以外发现的语言,其编程方式还需要依赖经验......尽管如此,TMP带来的效率改善仍然引人注目,C++对TMP的支持可能也会越来越多.

  • 相关阅读:
    Mac的Safari安装油猴插件(Tampermonkey)
    element表格点击行即选中该行复选框
    Previous operation has not finished; run 'cleanup' if it was interrupted最简单有效的解决方法
    读取JDK API文档,并根据单词出现频率排序
    Mac 下安装并配置 Tomcat
    Mac上安装并配置JDK
    GitHub注册失败,卡在第一步
    Jmeter 操作手册(三)
    Jmeter 操作手册(二)
    .Jmeter 使用手册(一)
  • 原文地址:https://www.cnblogs.com/reasno/p/4803100.html
Copyright © 2020-2023  润新知