元编程

什么是元编程(metaprogramming)

  • 利用模板可以进行编译期计算(数值计算,型式计算和代码计算)的特点进行程序设计

为什么可以进行元编程?

  • C++是两层语言:执行编译期计算的代码称为静态代码,执行运行期计算的代码称为动态代码
  • 模板可用于函数式编程,强调抽象计算,重视模块化,使用递归控制流程
  • 模板是图灵完备的:理论上,模板可以执行任何计算任务

为什么需要元编程?

  • 编译期计算可以使代码更通用,更易用,提升程序执行性能

元编程的缺点

  • 相对结构化编程,编译效率比较低
  • 代码丑陋不堪,阅读难,调试难,维护难,易导致代码膨胀

元编程可以做什么?

  • 数值序列计算,素性判断,控制结构,循环展开,型式判定,编译期多态,标签,元容器...

注:对于系统编程而言,意义不明显;

//Fibonacci数列
#include <iostream>
//类模板,计算Fibonacci数列的第i项
template<int i = > class Fibonacci
{
public:
enum{value = Fibonacci<i->::value + Fibonacci<i->::value};
};
//类模板特化,递归终止条件
template<> class Fibonacci<> {public:enum{value = }; };
template<> class Fibonacci<> {public:enum{value = }; };
int main()
{
std::cout << "Fib(" << << ")=" << Fibonacci<>::value << std::endl;
std::cout << "Fib(" << << ")=" << Fibonacci<>::value << std::endl;
std::cout << "Fib(" << << ")=" << Fibonacci<>::value << std::endl;
std::cout << "Fib(" << << ")=" << Fibonacci<>::value << std::endl; return ;
}

例子2:素数枚举

#include <iostream>
#include <iomanip>
//递归计算p是否为素数;若是,素数判定结论answer为1,否则为0
template<int p, int i> struct PrimeMagicCube
{
enum{answer = p%i && PrimeMagicCube<p,i->::answer};
};
//素数魔方类模板部分特化,递归终止条件,除数为1,没有找到因子
template<int p>struct PrimeMagicCube<p,>
{
enum{answer = };
};
//数值类模板,输出不大于i的全部素数
template<int i> struct Number
{
Number<i - > a;//递归定义数值对象
enum {answer = PrimeMagicCube<i,i->::answer};
void IsPrime()
{
//先降序输出全部素数,后升序输出全部数值素性序列
if (answer) std::cout << std::setw() << std::right << i;
a.IsPrime();//递归调用,计算下一数值的素性
std::cout << std::setw() << answer;
}
}; //数值类模板特化,终止于2
template<> struct Number<>
{
enum{answer = };
void IsPrime()
{
std::cout << std::setw() << std::right << << std::endl;
std::cout << std::setw() << answer;
}
}; int main()
{
Number<> a;//输出100内的所有素数
a.IsPrime();
std::cout << std::endl;
}

C++学习笔记37:元编程的更多相关文章

  1. 孙鑫VC学习笔记:多线程编程

    孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified ...

  2. Hadoop学习笔记(7) ——高级编程

    Hadoop学习笔记(7) ——高级编程 从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成 ...

  3. WCF学习笔记之事务编程

    WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...

  4. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  5. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  6. IOS学习笔记37——ViewController生命周期详解

    在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...

  7. Python学习笔记6 函数式编程_20170619

    廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...

  8. IOS学习笔记之 Socket 编程

    最近开始静心学习IOS编程,虽然起步有点晚,但有句话说的好:“如果想去做,任何时候都不晚”.所以在今天,开始好好学习IOS.(本人之前4年都是搞.Net的,java也培训过一年) 打算学IOS,从哪入 ...

  9. javascript 学习笔记之模块化编程

    题外: 进行web开发3年多了,javascript(后称js)用的也比较多,但是大部分都局限于函数的层次,有些公共的js函数可重用性不好,造成了程序的大量冗余,可读性差(虽然一直保留着注释的习惯,但 ...

随机推荐

  1. Android_listview_scrollListener

    layout.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...

  2. Redis命令参考(Keys & String)

    r = redis.Redis(ip, port, index) 如此实例化一个redis对象,index取值0-15,一个redis对象有16个库. Keys 函数 功能 返回值 备注 keys(s ...

  3. linux解压命令笔记

    转载:http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html .tar 解包:tar xvf FileName.tar打包:tar ...

  4. Java栈实现

    栈数组实现一:优点:入栈和出栈速度快,缺点:长度有限(有时候这也不能算是个缺点) public class Stack { private int top = -1; private Object[] ...

  5. 有关line-height的见解

    line-height:简单的说就是行高,是两行文字之间基线的距离.基线是指在英语的书写的4线3格中,从上往下数的第三条线 1.line-height与行内框盒子模型 所有内联元素的样式表现都与行内框 ...

  6. Unity3D 之UGUI制小地图

    这里使用UGUI制作一个小地图. 方法一: 第一步:使用UGUI弄一个地图背景和人物指针 第二步:脚本获取人物的位置和角度给人物指针进行同步 将 PlayerIconController.cs 文件绑 ...

  7. arcgis中的 style和serverstyle

    转自网络,原出处不明. .style文件是用ArcMap工具导出的符号库文件 .serverStyle文件是ArcEnging可用的符号库文件 需要转换才能使用. 第一:把.style文件拷贝到D:主 ...

  8. 字符串 前篇 ---- sizeof()操作符和strlen()库函数

    本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖.希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法).我们只做 实用意义 的介绍和讨论. 在介绍字符 ...

  9. article元素设计网络新闻展示

    article元素用来表示文档.页面中独立的.完整的.可以独自被外部引用的内容.它可以是一篇文章博客或者报刊中的文章.一篇论坛帖子.一段用户评论或独立的插件等.除了内容部分,一个article元素通常 ...

  10. jQuery 源码分析4: jQuery.extend

    jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的 // 如果传入一个对象,这个对象的属性会被添加到jQuery对象中 // 如果传入两个或多个对象,所 ...