zoukankan      html  css  js  c++  java
  • c++宏源证券编程

    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 

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

  • 相关阅读:
    Entity Framework简介
    Java学习笔记-spring-Bean作用于
    Java学习笔记-spring-Bean实例化
    第四章--第二节:类
    为什么越来越少的人用jQuery
    年入50万的方法
    第一节--项目介绍和初始化
    第四章--第一节:函数
    第一节--API爬虫--环境设置与课程简介
    第三章--第六节:元祖
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4905500.html
Copyright © 2011-2022 走看看