zoukankan      html  css  js  c++  java
  • 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的支持可能也会越来越多.

  • 相关阅读:
    pgspider sqlite mysql docker 镜像
    pgspider docker 镜像
    pgspider基于pg 的高性能数据可视化sql 集群引擎
    diesel rust orm 框架试用
    golang 条件编译
    Performance Profiling Zeebe
    bazel 学习一 简单java 项目运行
    一个好用node http keeplive agnet
    gox 简单灵活的golang 跨平台编译工具
    mailhog 作为smtp server mock工具
  • 原文地址:https://www.cnblogs.com/reasno/p/4803100.html
Copyright © 2011-2022 走看看