1,
模板实例化机制是一种基本的递归语言机制,可以用于在编译期执行复杂计算。


2,枚举值和静态常量
在原来的C++编译器中,在类声明的内部,枚举值是声明"真常值"(常量表达式)的唯一方法。
然而现在C++的标准化过程引入了在类内部对静态常量初始化的概念。

该版本存在一个缺点:静态成员变量只能是左值。因此如果具有如下一个声明:
void foo(int const&);
传入静态成员版foo(Pow3<7>::result);那么编译器将必须传递Pow3<7>::result的地址,而这会强制编译器实例化静态成员的定义,并为改定义分配内存。于是计算将不在局限于"编译期"的效果。
然而枚举值却不是左值(也就是说它没有地址)。因此当引用传递枚举值的时候,并不使用静态任何内存,就像文字常量的形式传递。
基于这些考虑使用枚举好些。

3,计算平方根


使用运算符 ?: 时,编译器不仅实例化运算符真分支的模板,同时也实例化负分支模板。
而且代码试图使用::运算符访问结果类的成员result,所以类中所有成员同时都会被实例化,
最终会产生数量庞大的实例化,总数大约的N的两倍。从而消耗大量内存。



使用IfThenElse模板能根据bool常量的值,在两个类型中选择其中一个。
为一个模板实例定义typedef并不会导致C++编译器实例化该实例的实体。
SubT只代表其中的一个类型。而且只有在查找SubT::result的时候,才会完全去实例化SubT所代表的类型。
使实例化数量趋近与log2(N)

4,使用归纳变量

上面并没有提供结束递归的局部特化,而是使用一个Value<>模板,它会返回模板实参的值作为所求的result。
使用IfThenElse<>后,实例化的数目会趋近与sqrt(N)。

5,
C++标准建议最多进行17层递归实例化。

6,使用元编程来展开循环

int result = 0;
for(int i< 0 ; i < Dim; i++)
{
result += a[i] * b[i];
}
对于许多迭代,编译器通常会优化这种循环,
上面循环可简单扩展为a[0]*b[0]+a[1]*b[1]+a[2]*b[2]…
如果需要执行上千万次点乘音响就会很大。


通常一些metaprogram的性能要比优化器的性能更好,因为metaprogram往往可以再计算过程中结合高层的知识。

7,计算素数



对于模板D而言,只存在一个正对void*的构造函数,所以吧1(int)赋值给D的时候会出错,而0却存在void*的转型所以可以顺利赋值给d.

Template_17_metaprogram的更多相关文章

随机推荐

  1. 项目源码--JSP在线客服系统(SSH框架技术)源码

    下载源码 技术要点: 1.网站开发技术框架 2.SSH技术框架(Struct,Spring,Hibrnate) 3.JSP技术框架 4.MYSQL数据库数据存储 5.即时通讯技术 6.源码带详细的中文 ...

  2. 编写一个简单的Jquery插件

    1.实现内容 定义一个简单的jquery插件,alert传递进来的参数 2.插件js文件(jquery.showplugin.js) (function ($) { //定义插件中的方法 var me ...

  3. The calculation of GPA

    Problem Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的.国外大学都是计算GPA(grade point average) 又称GPR(g ...

  4. maven安装仓库中不存在的jar包

    这里以ojdbc6.jar作为案例 首先我的ojdbc6.jar放在D盘的根目录D:\ojdbc6.jar 然后我们打开cmd命令窗口,运行命令:mvn install:install-file -D ...

  5. Oracle安装步骤及PL/SQL Developer连接数据库

    一:Oracle安装步骤及PL/SQL Developer连接数据库 win7 64位 11g 点击(操作步骤):http://www.cnblogs.com/haoke/articles/27343 ...

  6. Java Lock

    JVM中的另一种锁Lock的实现.与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的.在java.util.concurrent.locks包中有很多 ...

  7. C#后台格式化JSON字符串显示

    很多时候我们从服务器上获取的JSON字符串是没有格式化的,如下: {"BusinessId":null,"Code":200,"Data": ...

  8. 无线网络(WLAN)常见加密方式介绍

    在使用无线路由器配置wifi安全设定的时候经常会遇到各种加密方式,即不懂意思也不知道如何选择.本文将对此做一个简单的介绍. 1.WEP 有线等效协议(Wired Equivalent Privacy, ...

  9. ionic 中使用ion-slide-box

    ion-slide-box 用法: <ion-slide-box class="slide" auto-play="true" does-continue ...

  10. uva 12544 无向图最小环

    思路:这题的N有500,直接floyd肯定超时. 我的做法是每次枚举一个点,求出包含这个点的最小环. 对所有最小环取最小值.求包含某个点的最小环我用的是启发式搜索,先以该点求一次spfa,然后dfs解 ...