C++学习笔记37:元编程
元编程
什么是元编程(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:元编程的更多相关文章
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
- Hadoop学习笔记(7) ——高级编程
Hadoop学习笔记(7) ——高级编程 从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成 ...
- WCF学习笔记之事务编程
WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- IOS学习笔记37——ViewController生命周期详解
在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...
- Python学习笔记6 函数式编程_20170619
廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...
- IOS学习笔记之 Socket 编程
最近开始静心学习IOS编程,虽然起步有点晚,但有句话说的好:“如果想去做,任何时候都不晚”.所以在今天,开始好好学习IOS.(本人之前4年都是搞.Net的,java也培训过一年) 打算学IOS,从哪入 ...
- javascript 学习笔记之模块化编程
题外: 进行web开发3年多了,javascript(后称js)用的也比较多,但是大部分都局限于函数的层次,有些公共的js函数可重用性不好,造成了程序的大量冗余,可读性差(虽然一直保留着注释的习惯,但 ...
随机推荐
- Android View的绘制机制流程深入详解(三)
本系列文章主要着重深入介绍Android View的绘制机制及流程,第三篇主要介绍并分析视图状态以及重绘流程,首先剖析了 视图的几种状态,然后在深入分析视图的重绘机制流程. 真题园网:http://w ...
- div 块跟随 鼠标点击
js: $(document).ready(function () { $(".company-contact ul li").click(function (ev) { ...
- nginx笔记---http配置
1.三个逻辑区段 http:该区段嵌入配置文件的根部,在这个区段中允许定义指令和嵌入http相关模块.他包含了一个或多个server区段,他也能够使全局配置生效. server:这个区段建立了一个站点 ...
- Chomp!游戏 (组合游戏Combinatorial Games)
http://blog.csdn.net/acdreamers/article/details/17021095 有一个n*m的棋盘,每次可以取走一个方格并拿掉它右边和上面的所有方格.拿到左下角的格子 ...
- volley+NetworkImageView实现列表界面的列表项中的左侧图标展现之【实现已经加载的列表项的图标上翻的时候不重新加载】
参考资料:http://blog.csdn.net/guolin_blog/article/details/17482165 我使用的列表的适配器是继承ArrayAdapter的,所以关于使用voll ...
- MIME 部分扩展名与类型对应
svg image/svg+xml woff application/x-font-woff woff2 application/x-font-woff eot applicati ...
- Atom编辑器入门到精通(六) Markdown支持
尽管我们使用Atom主要是为了编写代码,不过Atom还支持编辑很多其他格式的文件. 比如Markdown和Asciidoc. 这一章中我们主要学习如何快速方便地编辑Markdown文件.另外在写这篇博 ...
- Spark技术内幕:Client,Master和Worker 通信源码解析
http://blog.csdn.net/anzhsoft/article/details/30802603 Spark的Cluster Manager可以有几种部署模式: Standlone Mes ...
- Ubuntu 16.04 - 64bit 访问Windows磁盘报错 he NTFS partition is in an unsafe state. Please resume and shutdown Windows fully (no hibernation ...
今天在打开某个磁盘时,突然报错,报错信息如下 原因:Windows 未正常关闭,导致系统误以为存在临时缓存文件 解决方法: http://www.linuxidc.com/Linux/2014-05/ ...
- list,tuple,dict,字符串常用知识总结
创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...