宏元编程——逻辑控制——实现循环一
2016-03-01 14:52
330 查看
循环宏定义
#define TL_WHILE(pred,op,state) while-bodypred是一个二元的宏形式是pred(d,state),当pred返回0的时候循环终止
op是一个二元的宏形式是op(d,state),它返回值是state_new
state代表初始状态
TL_WHILE宏的展开形式如下:
op(d, ... op(d, op(d, state)) ... )
实现思路
根据op(d, ... op(d, op(d, state)) ... )的形式,很容易想到用宏元编程提到的宏递归的方式实现。另外使用宏元编程——分支宏可以控制宏递归的停止条件。#include "tl/cat.h" #include "tl/control/if.h" #define TL_WHILE(pred,op,state) TL_WHILE_I_1(pred,op,state) #define TL_WHILE_I_1(pred,op,state) TL_IF(pred(1,state), TL_WHILE_I_2(pred, op, op(1,state)), state) #define TL_WHILE_I_2(pred,op,state) TL_IF(pred(2,state), TL_WHILE_I_3(pred, op, op(2,state)), state) #define TL_WHILE_I_3(pred,op,state) TL_IF(pred(3,state), TL_WHILE_I_4(pred, op, op(3,state)), state) #define TL_WHILE_I_4(pred,op,state) TL_IF(pred(4,state), TL_WHILE_I_5(pred, op, op(4,state)), state) #define TL_WHILE_I_5(pred,op,state) TL_IF(pred(5,state), TL_WHILE_I_6(pred, op, op(5,state)), state) #define TL_WHILE_I_6(pred,op,state) TL_IF(pred(6,state), TL_WHILE_I_7(pred, op, op(6,state)), state) #define TL_WHILE_I_7(pred,op,state) TL_IF(pred(7,state), TL_WHILE_I_8(pred, op, op(7,state)), state) #define TL_WHILE_I_8(pred,op,state) TL_IF(pred(8,state), TL_WHILE_I_9(pred, op, op(8,state)), state) #define TL_WHILE_I_9(pred,op,state) TL_IF(pred(9,state), TL_WHILE_I_10(pred, op, op(9,state)), state) #define TL_WHILE_I_10(pred,op,state) TL_IF(pred(10,state), TL_WHILE_I_11(pred, op, op(10,state)), state) #define TL_WHILE_I_11(pred,op,state) TL_IF(pred(11,state), TL_WHILE_I_END(pred, op, state), state) #define TL_WHILE_I_END(pred,op,state) TL_WHILE_FAILED_EXCEED_11_LIMIT(pred, op, state) #define PRED(n, state) TL_TUPLE_ELEM(1, state) #define OP(n, state) (BOOST_PP_INC(TL_TUPLE_ELEM(0, state)), BOOST_PP_DEC(TL_TUPLE_ELEM(1, state))) #define TUPLE1 (4,10) #define TUPLE2 (4,11) #define TUPLE3 (4,5) TL_WHILE(PRED,OP,TUPLE1) => (14, 0) TL_WHILE(PRED,OP,TUPLE2) => TL_WHILE_FAILED_EXCEED_11_LIMIT(PRED, OP, (14, 1)) TL_WHILE(PRED,OP,TUPLE3) => (9, 0)
相关文章推荐
- Spring整和ActiveMQ
- Yii2 where
- java多线程锁种类
- Spring MVC 单个文件上传
- Ubuntu上轻松实现PHP扩展
- Java Resources是什么
- MapReduce实现join操作
- QT中对BSON的处理
- java区分访问端来源
- java工作中的经验60条
- C#中base和this关键字
- java基础题
- C#中override和overload的区别
- 新手留言薄asp.net MVC 学习(适合新手学习)
- 【转】常见排序算法分析及java实现
- 【leetcode】【58】Length of Last Word
- java基础--ThreadPoolExecutor源码分析
- 浅析python 中__name__ = '__main__' 的作用
- JAVA之DecimalFormat的用法---用户格式化数据
- Java工具类中注入Bean