可变参数宏的展开,宏重载
重载(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个参数