c++模板元编程
2016-02-25 15:48
288 查看
元编程介绍
借助c++编译期模板展开逻辑生成c++代码的过程叫做模板元编程。对比c++语言本身,编译期间可以访问的数据叫做元数据,操作元数据的代码叫做元函数。元数据
编译期可以感知的常量,如类型,整形常量(包括枚举变量,函数地址等)
元函数
meta_function_name<type-arguments>::type
meta_function_name<type-arguments>::value
定义一个函数: template <int I> struct Value { typedef type int; enum {value = I} } 调用函数 int result = Value<10>::value; typedef Value<10>::type value_type;
元编程应用
使用元编程可以在c++的编译器进行数值计算,类型检查,代码生成数值计算
数值计算元函数返回结果是计算好的数值,标准访问方式是:meta_function_name<type-arguments...>::value阶乘计算
template <int N> struct Factorial { enum {result = N*Factorial<N-1>::result}; }; template<> struct Factorial<1> { enum {result = 1}; };
int ret = Factorial<10>::result;如果调用此函数计算阶乘,它的结果是在编译期间计算好然后再赋值给变量result
上面语句生成的汇编代码如下:
类型计算
类型计算元函数返回结果是类型,一般都是typedef出来的,标准访问方式是:meta_function_name<type-arguments...>::typetemplate <bool condition, typename T1, typename T2> class IfThenElse { typedef T1 ResultType; } template <false, typename T1, typename T2> class IfThenElse { typedef T2 ResultType; }
typedef IfThenElse<true,int,char>::type ResultT;类型的赋值只能通过typedef,类似于数值赋值采用=
代码生成
阶乘计算template <int N> struct Factorial2 { static int Result() { return N * Factorial2<N-1>::Result(); } }; template<> struct Factorial2<1> { static int Result() { return 1; } };
int ret = Factorial2<3>::Result();上面的代码调用会产生循环展开代码,如下:
先调用Factorial2<3>::Result()
再调用Factorial2<2>::Result()
计算Factorial2<3>::Result()的结果用3*Factorial2<2>::Result()
小结:
元数据的引用会触发编译期计算(包括常量,类型)。
如果直接通过模板类定义对象,例如template_class_name<type-arguments> a,或者引用类的静态成员函数
[b]template_class_name<type-arguments>::func(a,b)。这些都会触发代码生成。
[/b]
相关文章推荐
- 面试题五 C/C++面试秘笈 之链表的正向排序--程序员面试题
- 请问在VC++2010中如何连接用Access2010创建好的accdb数据库?
- [c++]string中删除相同字符
- C语言 链表的使用(链表的增删查改,链表逆转,链表排序)
- C++ template —— tuple(十三)
- 面试题四 C/C++面试秘笈 之判断链表是否存在环形链表问题-程序员面试题
- c++服务端用webservices【gsoap】做服务端与java后台对接信息的测试工具
- C++虚继承的概念
- 面试题三 C/C++面试秘笈 查找单链表的中间元素 --程序员面试题
- c语言入门之项目4.3——利用for循环求1-1/2*2+1/2*2*2...-1/2*2*2*2到2的8次方
- winodws平台C++共享内存实现
- C++基础知识易错点总结(2)
- C语言知识整理(二)
- [C++]智能指针
- 面试题二 C/C++面试秘笈 之单链表逆转/反转
- AVL树的插入删除操作
- 本科教育忽略的黄金C++<5> 泛型算法-特定容器算法
- 字符串匹配
- c语言入门之项目4.1——利用for循环求1!+2!+3!...12!
- [C++11]_[初级]_[左值引用声明和右值引用声明]