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 表示零個或...