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. Linux内存管理学习笔记 转

    https://yq.aliyun.com/articles/11192?spm=0.0.0.0.hq1MsD 随着要维护的服务器增多,遇到的各种稀奇古怪的问题也会增多,要想彻底解决这些“小”问题往往 ...

  2. 基于HTML5实现的中国象棋游戏

    棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电 ...

  3. Java经典算法四十例编程详解+程序实例

    JAVA经典算法40例 [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   1.程 ...

  4. 标准库 - fmt/format.go 解读

    // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

  5. 关于解决android4.0系统中菜单无法添加Icon的问题

    在Android4.0系统中,创建菜单Menu,然后通过setIcon方法给菜单添加图标是无效的,图标不会显出来,而之前的系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 ...

  6. #pragma weak

    采用 #pragma weak name 形式时,指令使 name 成为弱符号.链接程序没有找到 name 的符号定义时,不会显示错误消息,也不会出现符号的多个弱定义的错误消息.链接程序仅执行第一个遇 ...

  7. Laravel自学第一课:laravel下载与安装

    本地安装laravel,php环境要配置好,推荐xmapp一键搭建. 1.程序包直接从官方下载,官方开源地址:https://github.com/laravel/laravel(当然也可从此网站:h ...

  8. 重构9-Extract Interface(提取接口)

    我们来介绍一个常常被忽视的重构:提取接口.如果你发现多于一个类使用另外一个类的某些方法,引入接口解除这种依赖往往十分有用.该重构实现起来非常简单,并且能够享受到松耦合带来的好处. public cla ...

  9. SQL语言简介

    什么是SQL语言? 是高级非过程化语言(是沟通数据库服务器和客户端的工具) 作用:存取,查询,更新和管理关系数据库系统 SQL语言分类: 1.DDL:数据定义语言 作用:定义和管理数据当中的各种对象 ...

  10. linux安装mysql出现Could NOT find Curses (missing CURSES_LIBRARY CURSES_INCLUDE_PATH)解决方法

    编译 mysql5.6.22 出现以下错误提示: — Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH) CMak ...