va_list ptr
: 定義乙個指向可變引數列表的指標
va_start(ptr, a)
:初始化指標,其中第二個引數為函式可變引數列表之前的固定引數
va_arg(ptr,int)
:取出指標指向的元素,第二個引數為元素的型別,返回值為取出的元素,同時指標後移。
va_end(ptr)
: 還原ptr指標
#include
// 確定:要知道有多少個引數,並且要知道每個引數的型別
void
print
(int a,..
.)intmain()
弊端,必須要知道可變引數的個數和引數型別
_check_return_opt_
_crt_stdio_inline int __crtdecl printf
( _in_z_ _printf_format_string_ char
const
*const _format,..
.)
va_args:
c99新增的巨集,用來替換巨集定義中的可變引數列表
#define log(format, ...) fprintf(stdout, format, __va_args__)
log(
"%d, %c",2
,'x');
// 2 x
#define log2(x) printf("log2 "#x" %d \n", x);
// #會吧引數轉換成字串
int tmpint =
100;
log2(55
);// log2 55 55
log2
(value)
;// log2 value 100
// ##當可變引數為0時去掉逗號和後面的資料
#define log_type(format, ...) do while(0)
#將變數轉化成字串
##用於巨集中的引數替換, 如 #define test(x) f(a##x) . test3 => f(a3)
#include
#define model_naem "model_name"
#define err_print(fmt, ...) \
printf("[error!] ["model_naem": (fun)%s, (line)%d] " fmt, __func__, __line__, ##__va_args__)
// 注意fmt和前面字串之間的鏈結方式
intmain
(void
)
#include
#include
using namespace std;
// 遞迴結束
template
void
showone
(t t)
template..ts>
void
showone
(t t, ts.
.. ts)
template.. t>
void
show
(t..
. ts)
intmain()
const 引用版本
template
void
displayone
(t t)
template.. ts>
void
displayone
(const t1 &t1,
const ts&..
. ts)
template.. t>
void
display
(const t&..
. ts)
intmain()
右值引用版本
#include
#include
#include
using namespace std;
template
void
print
(t &&t)
template
void
printargs
(t &&arg)
template.. ts>
void
printargs
(t &&arg, ts&&..
. args)
intmain()
#include
#include
#include
#include
using namespace std;
template
void
print
(t &&t)
template.. ts>
void
expand
(ts.
.. ts)
;// 會被展開為
//或者改進為std::initializer_list;
//用lambda表示式實現(gcc4.8.6編譯報錯)
std:
:initializer_list<
int>()
,0).
..};
}int
main()
template .. ts>
class classa;
// 可變引數模板類可以攜帶多個不同的引數
classa<
int>
classa<
int,
char
>
classa<
>
//----------------------------
// 前向宣告
template .. ts>
class classts;
// 特化處理,遞迴終止函式
template
class classts;}
;template .. ts>
class classts>;}
;int
main()
參考:
c++11——可變引數模板
c 語言 define 變參__va_args__使用
#、##、__va_args__和##__va_args__的作用
c++反射機制
c++可變引數模板
備註:之後看了模板再來補充
可變引數列表
模擬實現printf函式 va list是在c語言中解決變參問題的一組巨集,所在標頭檔案 include 用於獲取不確定個數的引數 va start,函式名稱,讀取可變引數的過程其實就是在堆疊中,使用指標,遍歷堆疊段中的引數列表,從低位址到高位址乙個乙個地把引數內容讀出來的過程 va arg,這個巨...
可變引數列表
小二,上 class a public class varargs two param static void twostringparam string a,string b three param 參照上兩種寫法,一直往後面加。是不是感覺很憂傷 幸好這不是真的。string.a static v...
可變引數列表
測試環境 vs2008 1 可變引數列表 為什麼需要可變引數呢?在函式原型中,列出了函式期望接受的引數,原型只能顯示固定數目的引數,如果函式原型列出的引數與可呼叫引數不匹配或數目不一樣,程式將無法執行。例如,我們想要求一系列值的平均值,這裡的一系列的數目是不確定的,如果這些值儲存於陣列中,這個任務就...