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. Parse--Saving Images(翻译)

    原文地址:https://www.parse.com/tutorials/saving-images 学习如何创建一个关于允许用户拍照和上传到parse.com的APP 源码地址:https://gi ...

  2. Flex+Struts2+JSON实现Flex和后台的HTTP Service请求

    http://www.fengfly.com/plus/view-191093-1.html Flex+Struts2+JSON的后台代码我在这就不多说了.不懂得请看我写的上一篇文章<Strut ...

  3. 如何避免MVC Model First 设计时添加的DataAnnotation被覆盖掉

    结合多方资料做一系统,发现Code First中所有代码要自己写,无法自动生成(暂时没有找到方法,有知道的大能,给指点一下,好像在NuGet中有一个插件可以直接从数据库中生成Code First所需类 ...

  4. DOS命令如何进入指定的下一级目录?

    如cd E:\java workspace\test\src 如何进入E盘 ,直接 E:

  5. tachyon with spark

    spark1.2.0  tachyon0.5.0 jdk1.7 scala2.10.4 1.装好spark.tachyon.jdk.scala 2.修改spark-env.sh添加Tachyon客户端 ...

  6. Data Structure 之 算法设计策略

    1. 穷举法 基本思想:列举问题的所有可能解,并用约束条件逐一进行判定,找出符合约束条件的解. 穷举法的关键在于问题的可能解的列举和可能解的判别. 例如:凑数问题 2. 递归技术 定义:直接或间接调用 ...

  7. 使用solr的函数查询,并获取tf*idf值

    1. 使用函数df(field,keyword) 和idf(field,keyword). http://118.85.207.11:11100/solr/mobile/select?q={!func ...

  8. ASP.NET通过byte正确安全的判断上传文件格式

    本文介绍一种更安全的方式上传图片,他能有效的防止一些通过修改文件后缀或MIME来伪造的图片的上传,从而保证服务器的安全,希望对大家有所帮助. ASP.NET中在判断文件格式时,我们以前常用的方法就是通 ...

  9. api 翻译之AsyncTask

    AsyncTask 类的简介: AsyncTask可以使UI线程更合理更简单的使用.这个类允许执行后台操作,而且可以在不使用多线程或handlers的情况下给主线程传输数据. 异步任务 被定义为在后台 ...

  10. 重构23-Introduce Parameter Object(参数对象)

    有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , 由 于参 数 过 多 会 导 致 可 读 性 严 重 下 降 , 如 : 有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , ...