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
版权声明:本文博主原创文章,博客,未经同意不得转载。