宏元编程——技术——变参宏
来源:互联网 发布:软件魔盒社‘区 编辑:程序博客网 时间:2024/06/17 21:51
获取变参数宏的个数
#define TL_VARIADIC_SIZE(...) TL_CAT(TL_VARIADIC_SIZE_I(__VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,),)#define TL_VARIADIC_SIZE_I(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, size, ...) size
说明:__VA_ARGS__和长度列表生成一个新的调用列表,然后再调用TL_VARIADIC_SIZE_I,具体的长度值就会被“挤”到size参数里
获取变参数宏的第n个参数
#define TL_VARIADIC_ELEM(n, ...)
思路,可以通过TL_CAT把TL_VARIADIC_ELEM(n,...)映射成到一堆TL_VARIADIC_ELEM_n,再在TL_VARIADIC_ELEM_n里获取第n个元素e
#define TL_VARIADIC_ELEM(n, ...) TL_CAT(TL_VARIADIC_ELEM_##n,(__VA_ARGS__))#define TL_VARIADIC_ELEM_0(e0, ...) e0#define TL_VARIADIC_ELEM_1(e0,e1, ...) e1#define TL_VARIADIC_ELEM_2(e0,e1,e2, ...) e2#define TL_VARIADIC_ELEM_3(e0,e1,e2,e3, ...) e3#define TL_VARIADIC_ELEM_4(e0,e1,e2,e3,e4, ...) e4#define TL_VARIADIC_ELEM_5(e0,e1,e2,e3,e4,e5, ...) e5#define TL_VARIADIC_ELEM_6(e0,e1,e2,e3,e4,e5,e6, ...) e6#define TL_VARIADIC_ELEM_7(e0,e1,e2,e3,e4,e5,e6,e7, ...) e7#define TL_VARIADIC_ELEM_8(e0,e1,e2,e3,e4,e5,e6,e7,e8, ...) e8#define TL_VARIADIC_ELEM_9(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9 ...) e9
ps:如果把TL_VARIADIC_ELEM定义成
#define TL_VARIADIC_ELEM(n, ...) TL_VARIADIC_ELEM_##n(__VA_ARGS__)
下面的调用TL_VARIADIC_ELEM(3, 1,2,3,4,5)会报错。
not enough actual parameters for macro 'TL_VARIADIC_ELEM_3'
主要原因是调用TL_VARIADIC_ELEM_3宏的时候,把后面__VA_ARGS__当成一个整体参数了。通过使用TL_CAT它会它两边的结果拼接后再试着重新解析。
0 0
- 宏元编程——技术——变参宏
- 宏元编程——技术——宏重载
- 宏元编程——技术——auto_rec
- 宏元编程——技术——解决重入引起展开失败问题
- 《Ruby 元编程》——十年来读到的最好的编程技术书籍
- 《Ruby 元编程》——十年来读到的最好的编程技术书籍
- 《Ruby 元编程》——十年来读到的最好的编程技术书籍
- 宏元编程——代码生成
- 亨元模式——池技术
- 宏元编程——数据结构——tuple元组
- 元编程技法(1)——if_c
- 元编程技法(1)——if_c
- 元编程技法(1)——if_c
- 元编程技法(1)——if_c
- 元编程技法(1)——if_c
- 元编程技法(1)——if_c
- 元编程技法(1)——if_c
- ruby元编程——方法
- 微信公众平台获取不到Openid的一个怪问题
- Used to and Would
- (三) Freemarker 常用指令
- xtu1043节约每一个字节+贪心
- arcgis server之路网服务发布
- 宏元编程——技术——变参宏
- 修改crm的登录页面
- 【MarkDown使用技巧】轻松搞定MarkDown
- 数据库系统实现-第3章 索引结构
- RK29机型之Android系统启动流程
- 实践kafka生产者消息
- [FAQ04299]如何在activity中控制屏幕点亮与关闭
- (四)Freemarker 运算符
- ojdbc14.jar 与 classes12.jar 的区别