可变参数宏的展开,宏重载

重载(overloading),简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

C++里最常用和熟悉的有函数重载,运算符重载,模板重载。在开发过程中有时为了方便,用到宏,网上查了下,也能将宏重载。

http://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments?rq=1

VS和GCC展开__VA_ARGS__的方式有些不同,以下在VS2015下测试可行

1.定义

 1 #define PRIVATE_ARGS_GLUE(x, y) x y
 2 #define PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT(_1,_2,_3,_4,_5,_6,_7,_8,_9, N, ...) N
 3 #define PRIVATE_MACRO_VAR_ARGS_IMPL(args)  PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT args
 4 #define COUNT_MACRO_VAR_ARGS(...)  PRIVATE_MACRO_VAR_ARGS_IMPL((__VA_ARGS__,10,9,8,7,6,5 4,3,2,1,0))
 5 
 6 #define PRIVATE_MACRO_CHOOSE_HELPER2(M,count)  M##count
 7 #define PRIVATE_MACRO_CHOOSE_HELPER1(M,count)  PRIVATE_MACRO_CHOOSE_HELPER2(M,count)
 8 #define PRIVATE_MACRO_CHOOSE_HELPER(M,count)   PRIVATE_MACRO_CHOOSE_HELPER1(M,count)
 9 
10 #define INVOKE_VAR_MACRO(M,...) PRIVATE_ARGS_GLUE(PRIVATE_MACRO_CHOOSE_HELPER(M,COUNT_MACRO_VAR_ARGS(__VA_ARGS__)), (__VA_ARGS__))

COUNT_MACRO_VAR_ARGS用来统计参数个数,用的很巧妙。下面是使用方法

2.实现

 

1 #define PRINT_ARGS1(a1) std::cout<<a1<<std::endl
2 #define PRINT_ARGS2(a1,a2) std::cout<<a1<<","<<a2<<std::endl
3 #define PRINT_ARGS3(a1,a2,a3) std::cout<<a1<<","<<a2<<","<<a3<<std::endl
4 #define PRINT_ARGS4(a1,a2,a3,a4) std::cout<<a1<<","<<a2<<","<<a3<<","<<a4<<std::endl

3.使用

 

1 INVOKE_VAR_MACRO(PRINT_ARGS, 4);
2 INVOKE_VAR_MACRO(PRINT_ARGS, 4, 5);
3 INVOKE_VAR_MACRO(PRINT_ARGS, 4, 5, 6);

4.输出

4

4,5

4,5,6

5.优缺点

      优点:读写方便,使用宏时不需要后面带数字

      缺点:不支持0个参数

posted @ 2016-07-05 09:57  goooon  阅读(4647)  评论(0编辑  收藏  举报