模板元的简单学习

特别值得注意的是,因为C++的模板语言是在编译器编译的时候完成的,所以又称为静态语言,通常的C++语言又称为动态语言或者运行时语言。正是因为模板语言是在编译期完成的,所以我们可以借助于这种编译期的计算实现代码自动生成的目的,从而实现C++自动化编程。

编译期
宏typedef影射static类型变量和函数const 类型变量=,:?,-运算符enum运行期
对象使用函数调用变量赋值操作变量时&,+=,++,--等运算符。

所以,如果想实现模板元编程,必须要把握的是一定要在编译期完成程序,而不是在程序的运行期,仔细区分运行期和编译期是模板元编程的第一步。
#include <iostream>

//编译期四则计算的示例代码
template<size_t i,size_t j> struct Add { enum{value = i+j}; };
template<size_t i,size_t j> struct Sub { enum{value = i-j}; };
template<size_t i,size_t j> struct Mul { enum{value = i*j}; };
template<size_t i,size_t j> struct Div { enum{value = i/j}; };
int main()
{
        std::cout << "4+2=" << Add<4,2>::value << std::endl;
        std::cout << "4-2=" << Sub<4,2>::value << std::endl;
        std::cout << "4*2=" << Mul<4,2>::value << std::endl;
        std::cout << "4/2=" << Div<4,2>::value << std::endl;
        //为了证明上面的计算是在编译期进行的,我们编写下面的代码测试
        //将模板值作为数组定义时使用的参数就可以证明是在编译期执行的计算:)
        int a[Add<4,2>::value];//这么定义并没有错
        int b[Sub<4,2>::value];//这么定义并没有错
        int c[Mul<4,2>::value];//这么定义并没有错
        int d[Div<4,2>::value];//这么定义并没有错
        std::cout << sizeof(a)/sizeof(int) << std::endl;
        std::cout << sizeof(b)/sizeof(int) << std::endl;
        std::cout << sizeof(c)/sizeof(int) << std::endl;
        std::cout << sizeof(d)/sizeof(int) << std::endl;
        return 0;
}

运行结果:

2 利用模板元实现递归和循环

#include <iostream>

using namespace std;

//求阶乘
template<int N> struct power{
	enum {value = N * power<N - 1>::value};//循环递归过程
};
template<> struct power<0>{
	enum { value = 1} ;   //0的阶乘是1,也是循环的终止条件
};

//求和
template<unsigned int N>struct sum{
	enum{value = N + sum< N - 1 >::value};
};

template<> struct sum<1>{
	enum{value = 1};

};

void main(){
	int a[power<2>::value];
	cout<<sizeof(a) / sizeof(int)<<" ";

	int b[sum<3>::value];
	cout<<sizeof(b) / sizeof(int)<<" ";
}

运行结果:

参考文章:

http://blog.csdn.net/pandaxcl/article/details/665409

http://blog.csdn.net/ugg/article/details/2703326

模板元的简单学习

时间: 2024-11-08 08:18:56

模板元的简单学习的相关文章

C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE

本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的Win32库去. 逻辑结构和递归说白了就是做了一个If,一个For_N,If就和Excel里的If一样,For_N是把一个模板结构迭代N遍,为了所谓的方便,把If做成了宏,写起来还挺有意思的 1 template<typename TTest, typename TTrue, typename TF

varnish简单学习

操作系统:redhat5.5 前端服务器:varnish cache 2.1.5 监听端口8080 后端服务器:tengine 1.4.6 监听端口80 接着,建立varnish用户以及用户组,并且创建Varnish缓存目录和日志目录:[[email protected] ~]#useradd  -s /sbin/nologin varnish[[email protected] ~]#mkdir /data/varnish/cache[[email protected] ~]#mkdir /d

初识C++模板元编程(Template Mega Programming)

前言:毕设时在开源库上做的程序,但是源码看得很晕(当时导师告诉我这是模板元编程,可以不用太在乎),最近自己造轮子时想学习STL的源码,但也是一样的感觉,大致了解他这么做要干什么,但是不知道里面的机制.于是开始学习<C++模板元编程>,看完第二章对一些东西豁然开朗. PS:该书也有点老了,C++11标准还没出来,主要用的Boost库. Traits(特征) 说正题,在STL中经常可以见到后缀为traits的名字,比如经常用到的std::string,本质是类模板basic_string的第一个参

高内聚低耦合简单学习

起因:模块独立性指每个模块只完成系统要求的独立子功能,并且与其他模块的联系最少且接口简单, 两个定性的度量标准――耦合性和内聚性. 耦合性也称块间联系.指软件系统结构中各模块间相互联系紧密程度的一种度量.模块之间联系越 紧密,其耦合性就越强,模块的独立性则越差.模块间耦合高低取决于模块间接口的复杂性.调用的方 式及传递的信息.   耦合性分类(低――高): 无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦合; 1 无直接耦合: 2 数据耦合: 指两个模块之间有调用关系,传递的是简单的数

使用模板元编程操作类型集合(C++11下的TypeList)

Wrote by mutouyun. (http://darkc.at/cxx-type-list/) 群里有个朋友要实现这么一个功能:如何在编译期把一个函数类型的参数减少一个. 简单来说,就是实现下面这个模板: remove_func_par<2, void(int, long, short)>::type; // type = void(int, long) 根据输入的编译期整数,把函数参数表里对应的参数干掉一个. 为了实现这种功能,我们需要操作变参模板的参数包.比如像这样: // mak

AutoSharedLibrary -- 基于模板元编程技术的跨平台C++动态链接加载库

基于模板元编程技术的跨平台C++动态链接加载库.通过模板技术,使用者仅需通过简单的宏,即可使编译器在编译期自动生成加载动态链接库导出符号的代码,无任何额外的运行时开销. ASL_LIBRARY_BEGIN(TestLib) ASL_SYMBOL(Proc_test1, test1, false) ASL_SYMBOL(Proc_test2, test2, true) ASL_LIBRARY_END() TestLib theLib; try { theLib.Load("./1.so"

c++模板元编程二:用enum做数值计算

2.1 用enum做数值计算 下面两篇文章都介绍了模板元编程,enum是其最重要的基本工具 http://www.codeproject.com/Articles/3743/A-gentle-introduction-to-Template-Metaprogramming https://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html 因此可以得道以下结论: enum的值由编译器在编译期计算 利用模

AutoSharedLibrary -- 基于模板元编程技术的跨平台C++动态链接载入库

基于模板元编程技术的跨平台C++动态链接载入库.通过模板技术,使用者仅需通过简单的宏,就可以使编译器在编译期自己主动生成载入动态链接库导出符号的代码,无不论什么额外的执行时开销. extern "C" { typedef int(*Proc_fnTestDll)(); typedef const char* (*Proc_fnTestDll2)(const char*); } ASL_LIBRARY_BEGIN(Test) // 强制载入名为fnTestDll的接口,假设没有该接口.则

细说C++模板元编程

模板元编程根在模板,模板的使用很简单:为自动代码生成提供方便,提高程序员生产率的一个非常有效的方法就是代码复用,而面向对象很重要的一个贡献就是通过内部紧耦合和外部松耦合将思想转化成一个个容易复用的概念,但是面向对象提供的工具箱里面包含了所包含的继承,组合和多态并不能完全满足实际编程总对于代码复用的全部要求,与市模板就应运而生了. 模板时更智能的宏,模板和红都是编译前生成代码,模板和红相比,它站在更高的抽象上上面,宏操作的是字符串token,然而模板却能够操作c++中的类型,所以模板更安全,更智能