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. 解决Andriod使用HttpURLConnection 失败问题

    在Android的Activity中使用HttpURLConnection连接到服务端时抛出异常,Access denied.第一个想到是权限问题.然后就尝试将INTERNET权限加上:在Manife ...

  2. 终于懂了:TControl.Perform是有返回值的,且看VCL框架如何利用消息的返回值(全部例子都在这里)——它的存在仅仅是为了方便复用消息的返回值

    代码如下: function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint; var Message: TMess ...

  3. Android图片与旋转

    拍照后的照片有时被系统旋转,纠正过程例如以下: 1.先读取图片文件被旋转的角度: /** * 通过ExifInterface类读取图片文件的被旋转角度 * @param path : 图片文件的路径 ...

  4. jQuery中常用的函数方法

    jQuery中常用的函数方法总结 Ajax处理 load(url,[data],[callback]) url (String) : 待装入 HTML 网页网址. data (Map) : (可选) ...

  5. oschina 手机/移动开发

    手机/移动开发 Android UI 组件(167) React Native 相关(8) 网站客户端(16) NativeScript 插件(18) iPhone/iPad开发工具(16) WP7开 ...

  6. MySql数据库SQL语句将编码

    -- 查看所有字符编码 SHOW CHARACTER SET; -- 查看创建数据库的指令并查看数据库使用的编码 show create database dbtest; -- 查看数据库编码: sh ...

  7. Spring集成XFire开发WebService

    Spring是眼下最流行的JavaEE Framework,可是使用Spring的Spring-WS开发WebService却十分繁琐.XFire是一个简化WebService开发的开源项目.通过Sp ...

  8. A Game of Thrones(8) - Bran

    The hunt left at dawn. The king wanted wild boar at the feast tonight. Prince Joffrey rode with his ...

  9. IDEA系统提示中文乱码问题及解决

    近期要切换到IDEA开发, 在输出界面发现打印小方格, 或者乱码, 是由于字体不支持中文, 选择一个支持中文的就正常了.(由于IDEA在国内下载错误信息会用中文显示. 而之前Eclipse错误都是英文 ...

  10. SocketAsyncEventArgs使用解说

    原文:SocketAsyncEventArgs使用解说 如果在.NET下写过网络通讯的同学应该感觉不陌生了,有很多刚入门的同学很多都认为这东西可以大大提高处理效能还有就是使用上很不适应.其实使用之前最 ...