1,定义宏功能,作,func(x) = x-1?
     最简单的, 假设x = 2则 #define func(x) 1
特化出来x,令
#define func_helper_2 1
#define func(x) func_helper_##x
这样在x=2时就成立了.推广到其它数字仅仅需定义:
#define func_helper_2 1
#define func_helper_3 2
#define func_helper_4 3
...
就可以
得到递减和递增函数
#define DEC(X)
#define INC(X)

2,获取宏可变參数的个数?
看一下这个情况
#define func(a1,a2,a3,a4,...) a4
假设传入func(1,2,3,4,5)会是什么情况?

当然是4
传入func(x,1,2,3,4,5)此时呢?

是3

传入func(x,x,1,2,3,4,5)此时呢? 是2
传入func(x,x,,x,1,2,3,4,5)此时呢? 是1
倒过来呢?
是1,2,3
所以 #define func2(...) func(__VA_ARGES__)就可以

终于得到GET_ELEM_SIZE(X) 为获取5个数内參数个数

3,获取第n个參数?
如 GET_ELEMENT((a1,a2,a3),2)
期望获取到a3?

#define GET_ELEMENT(array,n) GET_ELEMENT_ ## n array
GET_ELEMENT_0(e0,...) e0
GET_ELEMENT_0(e0,e1...) e1
GET_ELEMENT_0(e0,e1,e2...) e2

如此具有了获取三个数以内指定坐标位置的參数了.

4,int转BOOL?

  #define INT_TO_BOOL(X)    INT_TO_BOOL_ ## X
  #define INT_TO_BOOL_0 0  
  #define INT_TO_BOOL_1 1
  #define INT_TO_BOOL_2 1
  #define INT_TO_BOOL_3 1
  #define INT_TO_BOOL_4 1

5,IF分支?
      #define IF_TEST(condition,true_verb,false_verb) IF_TEST_ ## condition (true_verb,false_verb)\
      #define IF_TEST_0(true_verb,false_verb) false_verb
      #define IF_TEST_1(true_verb,false_verb) true_verb

3,iterator?
定义ITER_FUNC(n,context) 为以n为參数的宏函数则:
#define ITERATOR(n,ITER_FUNC,context) ITERATOR_ ## n (ITER_FUNC,context)
#define ITERATOR_0(n,func)
#define ITERATOR_1(func,context) ITERATOR_0(func,context) func(1,context)
#define ITERATOR_2(func,context) ITERATOR_1(func,context) func(2,context)
#define ITERATOR_3(func,context) ITERATOR_2(func,context) func(3,context)
reverse 版本号
#define ITERATOR_REVERSE(n,ITER_FUNC,context) ITERATOR_REVERSE_ ## n (ITER_FUNC,context)
#define ITERATOR_REVERSE_0(n,func)
#define ITERATOR_REVERSE_1(func,context) func(1,context) ITERATOR_REVERSE_0(func,context)
#define ITERATOR_REVERSE_2(func,context) func(2,context) ITERATOR_REVERSE_1(func,context)
#define ITERATOR_REVERSE_3(func,context) func(3,context) ITERATOR_REVERSE_2(func,context)

4,数据结构?
基于上述工具,能够定义出宏的数组结构,能够定义array形式为:
array = (ele0,ele1,ele2)
获取数组大小,可应用情形2:
     #define GET_ARRAY_SIZE(array) GET_ELEM_SIZE array
对数组下标訪问,获取元素:
     #define GET_ARRAY_ELEMENT(array,n) GET_ELEMENT(array,n)
push一个元素:
     #define EXPAND_PARAM(param) param
     #define PUSH_ARRAY_ELEM(array,elem) EXPAND_PARAM array IF_TEST(GET_ARRAY_SIZE(array),EMPTY(),COMMA()) elem
pop 一个元素:
     #define POP_ARRAY_ELEM(array) ITERATOR(DEC(GET_ARRAY_SIZE(array)),COPY_ARRAY_FROM,array)
     #define COPY_ARRAY_FROM(n,array) IF_TEST(n,EMPTY(),COMMA()) GET_ARRAY_ELEMENT(array,n)


举个栗子!
追经典的只是是c++的tuple实现了,还记得那一大堆tuple的參数吗?

回想一下:
\\file tuple.h
template <>
class tuple{}

template <class T1>
class tuple{
     tuple (T1 a1){}
};

template <class T1,class T2>
class tuple{
     tuple (T1 a1,T2){}
};

支持10个參数就要写10个...

使用宏迭代函数:

ITERATOR(2,GEN_TUPLE,pass)

#define GEN_TUPLE(n,pass) \
template <ITERATOR(n,pass,GEN_TPARAM)>\
class tuple{\
     tuple (ITERATOR(n,class T,GEN_PARAM)){}\
};

#define GEN_TPARAM(n,pass) IF_TEST(n,EMPTY(),COMMA()) class T ## n 
#define GEN_PARAM(n,pass) IF_TEST(n,EMPTY(),COMMA()) T ## n a ## n 

版权声明:本文博主原创文章,博客,未经同意不得转载。

c++宏源证券编程的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  3. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  4. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  5. C#异步编程(一)

    异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...

  6. UE4新手之编程指南

    虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...

  7. C#与C++的发展历程第三 - C#5.0异步编程巅峰

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...

  8. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  9. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

随机推荐

  1. RF+Selenium2Library+Sikuli集成环境搭建

    Sikuli是通过截图来编写代码的脚本语言,他是对于Selenium不好处理的一些模态窗口.flash等的利器.废话少说,直接开始安装吧.安装RF+Selenium2Library的环境这里就不说了, ...

  2. python glob 用通配符查找指定目录中的文件 - 开源中国社区

    python glob 用通配符查找指定目录中的文件 - 开源中国社区 python glob 用通配符查找指定目录中的文件

  3. ogre sample分析(一)

    ogre自带了一些例子,逐个过一遍并自己动手做一些调整 1 Sample_BezierPatch:这个例子直接用数值来构造顶点缓存并创建entity,这种方法一般只能创建简单对象,本人以为复杂对象顶点 ...

  4. 【机器学习】SVM核函数

    知识预备 1. 回顾:logistic回归出发,引出了SVM,即支持向量机[续]. 2.  Mercer定理:如果函数K是上的映射(也就是从两个n维向量映射到实数域).那么如果K是一个有效核函数(也称 ...

  5. VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

    原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...

  6. hdu2063+hdu1083(最大匹配数)

    传送门:hdu2063过山车 #include <cstdio> #include <cstring> #include <string> #include < ...

  7. hdu3033(变形分组背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3033 题意:Iserlohn要买鞋,有k种牌子,每种牌子至少买一双鞋子.每双鞋子有标价跟实际价值.求用 ...

  8. Java对Xml进行操作的实例(转)

    这是一个用JAVA W3C DOM 进行XML操作的例子,包含了查询.增加.修改.删除.保存的基本操作.较完整的描述了一个XML的整个操作流程.适合刚入门JAVA XML操作的朋友参考和学习. 假设有 ...

  9. WPF界面设计技巧(4)—自定义列表项样式

    原文:WPF界面设计技巧(4)-自定义列表项样式 有前面修改按钮样式的基础,我们可以尝试来定制一个即好看又好用的 ListBox ,今天先来讲“好看”部分. 打开 Microsoft Visual S ...

  10. WPF界面设计技巧(3)—实现不规则动画按钮

    原文:WPF界面设计技巧(3)-实现不规则动画按钮 发布了定义WPF按钮的教程后,有朋友问能否实现不规则形状的按钮,今天我们就来讲一下不规则按钮的制作. 不规则按钮的做法实际上和先前我们做不规则窗体的 ...