省略號和可變引數模板

2021-07-27 16:42:39 字數 1980 閱讀 3946

1.基本概念

省略號在c/c++中有很多用途,包括函式的變數引數列表。c執行庫的printf()就是常見示例。

可變引數模板提供了型別安全和靈活性,可應用於類模板和函式模板。

2.語法示例

templateclass classname;  //省略好在typename後

templateclass classname; //省略號在arguments前

templateclass classname; //省略號在中間

以上格式都可以。可變引數模板可以有0個或多個引數,如果要求至少乙個引數:

templateclass classname;

可變引數模板函式示例:

templatereturntype fun(args... args);             //引數按值傳遞

templatareturntype fun(args&... args); //引數引用傳遞

templatareturntype fun(args*... args); //引數為指標型別

templatareturntype fun(const args&... args); //常量引用

templatareturntype fun(const one& arg1,const args&... args); //需要至少乙個引數

3. c中的省略號

在c中使用省略號顯得比較麻煩,示例如下:

#include #include void test(int a,...); 

int main()

void test(int a,...)

其中test函式是個簡單的示例,在c中使用省略號必須要有乙個指定引數(第一位引數),不能只有省略號。由於函式的引數入棧是從右往左入的,棧的生長是從高位址向低位址生長,所以在引數最左(第一位引數)指定引數就方便確定可變引數的位址了 ,不然沒法取得可變引數。

接下來va_list是指向引數的指標,在vadefs.h中定義如下:

typedef char *  va_list;

然後看一下va_start的定義:

#define _crt_va_start(ap,v)  ( ap = (va_list)_addressof(v) + _intsizeof(v) )

從該定義中可以看出來args指向了第二個引數2

然後下一句是執行了va_arg(args,int),然後列印

看一下它的定義

#define _crt_va_arg(ap,t)    ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )

這句話是將args指向了下乙個引數,但是輸出的是下乙個引數的上乙個:( -_intsizeof(t)),這樣可以從第二個引數開始,因為va_start已經將args指向了第二個引數,如果不( -_intsizeof(t))的話會跳過第二個,因為args是持續累加的,所以下面的va_arg(args,int)會連續指向第三個引數、第四個......

然後最後的va_end(args)是釋放args的指向

#define _crt_va_end(ap)      ( ap = (va_list)0 )

但是使用va_arg的話會一直指向下乙個,由於不知道引數的個數,早晚會記憶體溢位,這個問題還不太懂,留坑。。。

省略號和可變引數模板

1.基本概念 省略號在c c 中有很多用途,包括函式的變數引數列表。c執行庫的printf 就是常見示例。可變引數模板提供了型別安全和靈活性,可應用於類模板和函式模板。2.語法示例 templateclass classname 省略好在typename後 templateclass classna...

省略號和可變引數模板

1.基本概念 省略號在c c 中有很多用途,包括函式的變數引數列表。c執行庫的printf 就是常見示例。可變引數模板提供了型別安全和靈活性,可應用於類模板和函式模板。2.語法示例 template 可變引數模板可以有0個或多個引數,如果要求至少乙個引數 templateclass classnam...

可變引數模板

乙個可變引數模板就是乙個接受可變數目引數的模板函式或模板類。可變數目的引數被稱為引數包 parameter packet 存在兩種引數包 模板引數包 template parameter packet 表示零個或多個模板引數 函式引數包 function parameter packet 表示零個或...