重載(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個參數