可變參數宏的展開,宏重載


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM