日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁(yè) > 編程 > C++ > 正文

C++可變參數(shù)的函數(shù)與模板實(shí)例分析

2020-05-23 14:22:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例展示了C++可變參數(shù)的函數(shù)與模板的實(shí)現(xiàn)方法,有助于大家更好的理解可變參數(shù)的函數(shù)與模板的應(yīng)用,具體內(nèi)容如下:

首先,所謂可變參數(shù)指的是函數(shù)的參數(shù)個(gè)數(shù)可變,參數(shù)類型不定的函數(shù)。為了編寫能處理不同數(shù)量實(shí)參的函數(shù),C++提供了兩種主要的方法:如果所有的實(shí)參類型相同,可以傳遞一個(gè)名為initializer_list的標(biāo)準(zhǔn)庫(kù)類型;如果實(shí)參的類型不同,我們可以編寫可變參數(shù)模板。另外,C++還有一種特殊的省略符形參,可以用它傳遞可變數(shù)量的實(shí)參,不過(guò)這種一般只用于與C函數(shù)交互的接口程序。

一、可變參數(shù)函數(shù)

1、initializer_list形參

如果函數(shù)的實(shí)參數(shù)量未知但是全部實(shí)參的類型都相同,我們可以使用initializer_list類型的形參(C++11新標(biāo)準(zhǔn))。和vector一樣,initializer_list也是一種模板類型。下面看看initializer_list提供的一些操作:

#include<initializer_list> // 頭文件 initializer_list<T> lst;  // 默認(rèn)初始化,T類型元素的空列表 initializer_list<T> lst{a,b,c...}; // 初始化為初始值列表的副本 lst2(lst)   // 拷貝或賦值不會(huì)拷貝列表中的元素;拷貝后, lst2 = lst  // 原始列表和副本共享元素 lst.size()  // 列表中的元素?cái)?shù)量 lst.begin()  // 返回指向lst中首元素的指針 lst.end()   // 返回指向lst中尾元素下一位置的指針

下面給出一個(gè)例子,需要注意的是,含有initializer_list形參的函數(shù)也可以同時(shí)擁有其他形參。另外,如果想給initializer_list形參傳遞一個(gè)實(shí)參的序列,必須把序列放在一對(duì)花括號(hào)內(nèi):

string func(initializer_list<string> li) {   string str("");   for(auto beg=li.begin(); beg!=li.end(); ++beg)     str += *beg;   return str; }  int main() {   cout << func({"This"," ","is"," ","C++"}) << endl;   return 0; } 

2、省略符形參

函數(shù)可以用省略符形參”…“表示不定參數(shù)部分,省略符形參只能出現(xiàn)在形參列表的最后一個(gè)位置,它的形式如下:

void foo(parm_list, ...); // 典型例子 int printf(const char* format, ...) 

省略符形參應(yīng)該僅僅用于C和C++通用的類型,因?yàn)榇蠖鄶?shù)類類型的對(duì)象在傳遞給省略符形參時(shí)都無(wú)法正確拷貝。下面是<cstdarg>頭文件中的幾個(gè)宏定義:

#include<cstdarg> // C中是<stdarg.h>  // va_list是一種數(shù)據(jù)類型,args用于持有可變參數(shù)。 // 定義typedef char* va_list; va_list args;  // 調(diào)用va_start并傳入兩個(gè)參數(shù):第一個(gè)參數(shù)為va_list類型的變量 // 第二個(gè)參數(shù)為"..."前最后一個(gè)參數(shù)名 // 將args初始化為指向第一個(gè)參數(shù)(可變參數(shù)列表) va_start(args, paramN);  // 檢索參數(shù),va_arg的第一個(gè)參數(shù)是va_list變量,第二個(gè)參數(shù)指定返回值的類型 // 每一次調(diào)用va_arg會(huì)獲取當(dāng)前的參數(shù),并自動(dòng)更新指向下一個(gè)可變參數(shù)。 va_arg(args,type);  // 釋放va_list變量 va_end(args);

下面給出一個(gè)例子:

int add_nums(int count,...) {   int result = 0;      va_list args;   va_start(args, count);   for(int i=0; i<count; ++i)     result += va_arg(args, int);   va_end(args);   return result; }  int main() {   cout << add_nums(4, 25, 25, 50, 50) << endl;   return 0; } 

編譯器是將參數(shù)壓入棧中進(jìn)行傳遞的。傳遞實(shí)參的時(shí)候,編譯器會(huì)從實(shí)參列表中,按從右到左的順序?qū)?shù)入棧,對(duì)于add_nums(4, 25, 25, 50, 50)的調(diào)用,則入棧的順序是 50, 50, 25, 25, 4 (注意沒(méi)有可變參數(shù)與不可變參數(shù)之分)。由于棧的地址是從高到低的,所以在知道了第一個(gè)參數(shù)地址和參數(shù)的類型之后,就可以獲取各個(gè)參數(shù)的地址。

二、可變參數(shù)模板

一個(gè)可變參數(shù)模板(variadic template)就是一個(gè)接受可變數(shù)目參數(shù)的模板函數(shù)或模板類??勺償?shù)目的參數(shù)被稱為參數(shù)包(parameter packet)。存在兩種參數(shù)包:模板參數(shù)包(表示零個(gè)或多個(gè)模板參數(shù))和函數(shù)參數(shù)包(表示零個(gè)或多個(gè)函數(shù)參數(shù))。

上述說(shuō)到我們可以使用一個(gè)initializer_list來(lái)定義一個(gè)可接受可變數(shù)目實(shí)參的函數(shù),但是所有實(shí)參必須具有相同的類型。當(dāng)我們既不知道要處理的實(shí)參數(shù)目也不知道它們的類型時(shí),我們就需要使用可變參數(shù)的函數(shù)模板了。我們用一個(gè)省略號(hào)來(lái)指出一個(gè)模板參數(shù)或函數(shù)參數(shù)表示一個(gè)包:在一個(gè)模板參數(shù)列表中,class...或typename...指出接下來(lái)的參數(shù)表示零個(gè)或多個(gè)類型的列表;一個(gè)類型名后面跟一個(gè)省略號(hào)表示零個(gè)或多個(gè)給定類型的非類型參數(shù)的列表。在函數(shù)參數(shù)列表中,如果一個(gè)參數(shù)的類型是一個(gè)模板參數(shù)包,則此參數(shù)也是一個(gè)函數(shù)參數(shù)包。

// Args是一個(gè)模板參數(shù)包;rest是一個(gè)函數(shù)參數(shù)包 template <typename T, typename...Args> void foo(const T &t, const Args&...rest); 

可變參數(shù)函數(shù)模板通常是遞歸的。第一步調(diào)用處理包中的第一個(gè)實(shí)參,然后用剩余的實(shí)參調(diào)用自身。為了終止遞歸,我們還需要定義一個(gè)非可變參數(shù)的函數(shù)模板:

// 用來(lái)終止遞歸并處理包中最后一個(gè)元素 template <typename T> void print(const T &t) {   cout << t; }  // 包中除了最后一個(gè)元素之外的其他元素都會(huì)調(diào)用這個(gè)版本的print template <typename T, typename...Args> void print(const T &t, const Args&...rest) {   cout << t << " ";   // 打印第一個(gè)實(shí)參   print(rest...);    // 遞歸調(diào)用,打印其他實(shí)參 }  // 測(cè)試 int main() {   print("string1", 2, 3.14f, "string2", 42);   cout << endl;   return 0; } 

非可變參數(shù)版本的print負(fù)責(zé)終止遞歸并打印初始調(diào)用中的最后一個(gè)實(shí)參。對(duì)于最后一次遞歸調(diào)用print(42),兩個(gè)print版本都是可行的。但是,非可變參數(shù)模板比可變參數(shù)模板更特例化,因此編譯器選擇非可變參數(shù)版本。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产一区精品在线| 午夜亚洲一区| 欧美日韩在线播放三区四区| 中文字幕精品视频| 日韩欧美三级在线| 日韩欧美国产综合| 日韩欧美综合在线视频| 中文字幕日韩欧美| 亚洲制服一区| 亚洲三级av| 日韩中文字幕91| 亚洲综合日韩| 国产 中文 字幕 日韩 在线| 大香一本蕉伊线亚洲网| 不卡福利视频| 91久久精品在线| 国产成人精品网址| 国产日韩中文在线| 亚洲欧美中文字幕在线一区| 99中文字幕一区| 日韩视频 中文字幕| 久久精品女人| 欧美日韩国产免费观看视频| 91精品国产免费| 成片免费观看| 久久久精品福利| 久久精品99久久久久久久久 | 亚洲欧美999| 国产欧美日韩精品在线| 日韩精品乱码av一区二区| 国产一级视频在线播放| 中文字幕亚洲高清| 欧美国产一级片| 日韩精品在线免费看| 欧美日韩久久不卡| 97最新国自产拍视频在线完整在线看 | 中文字幕精品在线视频| 日韩在线精品| 欧美日韩中国免费专区在线看| 中文字幕亚洲在| 久久精品国产91精品亚洲| 日韩不卡在线播放| 一区二区在线看| av中文在线播放| 日韩欧美久久久| 中文字幕 亚洲一区| 久久99蜜桃精品| 香蕉视频亚洲一级| 国产真实乱子伦精品视频| 国产1卡2卡三卡四卡网站| 中文字幕欧美日韩精品| 国产激情99| 天天综合天天添夜夜添狠狠添| 91一区二区| 亚洲羞羞网站| 久久精品蜜桃| 999精品视频在线观看播放| 亚洲第一网中文字幕| 国产欧美三级| 婷婷中文字幕综合| 欧美熟妇乱码在线一区| 日韩 欧美 中文| 91精品久久久久久蜜臀| 日韩精品一区二区三区视频播放| 久久婷婷亚洲| 深夜福利一区| 国产欧美日产一区| 午夜一区二区三区视频| 午夜精品免费视频| 日韩美女中文字幕| 亚洲一卡二卡在线观看| 欧美国产中文| 日韩在线精品| 日韩免费不卡avV| 成人久久久久| 欧美日韩第一| 日韩中文字幕在线视频播放| 欧美国产综合在线V| 视频一区二区国产| 精品国产乱码久久久久久牛牛| 一区二区三区精品在线| 精品国产乱码一区二区| 日韩精品乱码av一区二区| 日韩欧美高清在线| 国产卡1卡2卡三卡在线| 中文字幕欧美亚洲| 日韩亚洲欧美中文在线| 国产一区三区三区| 日韩精品在线第一页| 日韩欧美中文字幕精品| 欧美自拍一区| 欧美日韩国产片| 91久久精品国产91久久| 欧美一级搡bbbb搡bbbb| 精品一区二区三区中文字幕 | 中文字幕精品一区二区三区在线 | 成人a在线观看| 日韩精品―中文字幕| 中文字幕线观看| 中文字幕第一页在线| 欧美日韩乱国产| 免费在线亚洲| 一区二区三区在线|网站| 亚洲综合日韩欧美| 樱花草www在线| 91精品国产综合久久精品| 精品国产综合久久| 欧美日韩综合在线| 精品免费视频| 伊人亚洲视频| 中文字幕日韩免费视频| 国产一区精品| 国产九九在线| 中文字幕精品一区二| 欧美一级免费观看| 中文字幕日韩高清| 日韩午夜黄色| 在线日韩中文字幕| 成人无遮挡免费网站视频在线观看| www.狠狠干| 中文在线第一页| 欧美 日韩 国产在线观看| 午夜影院在线观看欧美| 中文字幕亚洲免费| 日韩三级精品| 国产成人精品网址| 欧美色欧美亚洲高清在线视频| 国产福利三区| 国产裸舞福利在线视频合集| 国产黄色在线播放| 久久久99久久| 中文字幕乱码在线| 中文字幕日韩第一页| 日韩中文字幕在线观看视频| 最新中文字幕在线| 日韩欧美在线网站| 99视频在线看| 国产欧美日产一区| 日韩欧美资源站| 一区二区日韩视频| 欧美在线亚洲一区| 欧美日韩在线播放一区| 午夜国产福利一区二区| 国产日韩av一区| 精品九九久久| 在线精品观看| 国产欧美日韩在线| 久久久99免费| 欧美日韩在线综合| 日韩欧美在线综合| 一本一道久久a久久精品综合蜜臀| 影音先锋一区二区资源站| 国产视频一二区| 麻豆一区二区99久久久久| 欧美国产91| 日韩欧美中文字幕一区| 国产免费不卡av| 精品久久在线观看| 国产成人一区二区精品非洲| 亚洲尤物av| www中文字幕在线观看| a在线观看免费视频| 国产一区精品在线| 天天摸日日摸狠狠添| 在线视频你懂得一区| 99日韩精品| 国产免费一级| 亚洲视频中文字幕| 91精品国产综合久久福利| 国产成人精品免费在线| 国产福利第一页| 精品国内自产拍在线视频| 久久久精品午夜少妇| 日韩欧美色综合网站| 欧美亚洲国产日韩| 欧美.日韩.国产.一区.二区| 精品久久久久久综合日本欧美| 精品视频国产| 91精品国产91久久久久久三级| 日韩欧美在线精品| 久久久水蜜桃| 欧美日韩视频免费| 91精品国产高清久久久久久| 日韩网站中文字幕| 日韩欧美在线综合| 一级片免费在线播放| 日韩午夜高潮| 一区免费视频| 99亚洲视频| 亚洲热线99精品视频| 中文字幕日韩在线视频| 蜜桃视频中文字幕| 偷窥国产亚洲免费视频| 国产丝袜一区二区| 精品日本视频| 91精品国产91久久久久青草| 日韩欧美国产不卡| 国产裸体歌舞团一区二区| 欧美三级在线视频| 国产黄在线播放| 国产字幕中文| 九一精品国产| 精品日韩视频在线观看 | 亚洲 欧美 日韩系列| 国产天堂素人系列在线视频| 欧美一级久久久久久久久大| 亚洲 国产 欧美 日韩| 国内激情久久| 亚洲福利在线视频| 中文字幕欧美日韩va免费视频| 五月综合激情日本mⅴ| 欧美亚洲另类制服自拍| 亚洲高清在线免费| 日韩av一区二区在线| www.狠狠干| 韩国v欧美v日本v亚洲| 亚洲三级免费看| 欧美不卡视频| 中文字幕欧美日韩在线不卡| 日韩中文在线中文网三级| 日韩视频在线一区二区三区| 欧美性生交大片免费| 欧美三级网址| 亚洲日本精品视频| 日韩精品在线观| 亚洲三级免费看| 一二三区精品视频| 999视频精品| www.老鸭窝.com| 国产一卡2卡3卡四卡网站| 国产欧美日韩不卡免费| 在线三级av| 69免费视频| 在线观看一区日韩| 欧美日韩在线国产| www.老鸭窝.com| 美女在线视频一区| 在线视频国内一区二区| 亚洲欧洲在线观看av| 国产欧美亚洲一区| 日韩精品a在线观看91| 久久久精品网| 一区二区在线看| 97最新国自产拍视频在线完整在线看 | 亚洲一区在线观看免费| 欧美在线日韩精品| 国产一级在线免费观看| 国产欧美久久久精品免费| av免费观看国产| 日韩午夜黄色| 国产欧美综合在线观看第十页| 在线欧美日韩国产| 日韩欧美国产亚洲| 精品一二三区视频| 亚洲一区二区三区精品中文字幕| 久久久久黄色| 欧美日韩中文字幕精品| 日韩视频不卡中文| 在线视频不卡一区二区| 免费视频国产一区| 一区二区三区高清在线| 欧美三级在线视频| 午夜影院在线观看欧美| 欧美国产91| 91精品国产综合久久久久久漫画| 精品成人久久久| 最近中文字幕日韩精品| 日韩视频专区| 久久精品国产视频| 最新中文字幕在线播放| 日韩欧美中文字幕公布| 精品国产不卡一区二区| 国产成人精品三级| 粉嫩喷白浆久久| 国产裸体歌舞团一区二区| 国产男女av| 二区中文字幕| 国产伦精品免费视频| 91精品久久久久| 精品国产乱码一区二区| 国产一二三四| 国产www.大片在线| 搞黄在线观看| 欧美日韩在线视频免费观看| www.中文字幕在线观看| 91精品婷婷国产综合久久竹菊| 免费在线视频一区二区| 精品视频123区在线观看| 国产一级一片免费播放| 在线一区av| 久久精品女人| 亚洲免费播放| 国产福利免费在线观看| 中文字幕国产日韩| 91精品网站| 在线观看区一区二| 欧美日韩精品综合在线 | 久久99精品久久久| 日韩一级免费视频| 日韩精品资源二区在线| 国产手机视频一区二区| 欧美日韩国产综合视频在线观看中文| 91精品国产综合久久精品app| 国产亚洲欧美色| 欧美日韩一二三| 黄色一级大片在线免费看国产一| 中文不卡在线| 樱花草www在线| 日韩精品一页| 国产一级网站视频在线| 日韩亚洲欧美中文高清在线| 欧美日韩视频在线| 日韩在线观看精品| 国产综合成人久久大片91| 精品一二三区视频| a√免费观看在线网址www| 国产最新在线| 亚洲va韩国va欧美va精品| 国产成人精品免费网站| 精品国产999| 一区二区不卡在线播放| 日韩一级视频在线观看| 高清在线一区| 国产成人精品综合久久久| 欧美日韩亚洲91| 日韩精品一级| 精人妻一区二区三区| 在线免费91| 久久精品女人| 99精品电影| 国产不卡一区| 日韩欧美国产成人精品免费| 欧美日韩精品免费在线观看视频| 午夜精品一区二区三区免费视频| 中文字幕成人乱码在线电影| 91精品国产综合久久香蕉最新版| 国产三级精品网站| 91色在线看| 欧美国产91| 91精品国产综合久久久久久漫画| 天堂在线www天堂中文在线| www.精品视频| 欧美三级网址| 91九色精品视频| 精品视频三区| 日韩av一区二区在线| 欧美日韩中文字幕在线| 国产乱一区二区| 亚洲免费在线观看av| 99精品视频99| 国产一区在线精品| 国产午夜精品全部视频播放| 一级日韩一级欧美| 欧美另类久久久品| 蜜桃久久av| 日韩国产亚洲欧美| 日本va欧美va精品发布| 国产午夜精品久久| 精品视频1区2区3区| 精品久久久精品| 韩国av一区二区| 国产乱一区二区| 国产最新在线| 国产wwww| 中文在线а√在线8| 日韩在线视频中文字幕| 中文字幕五月欧美| 日韩三级视频在线| 91精品国产综合久久久蜜臀粉嫩| 99视频精品全国免费| 中文字幕狠狠干| 久久久精品网| 日韩欧美在线不卡| 午夜国产欧美理论在线播放| 欧美日韩精品是欧美日韩精品| 国产欧美日韩亚州综合| 亚洲永久字幕| 黄色片免费看| 国产99亚洲| 欧美日韩乱国产| 欧美日韩国产在线播放| 99综合精品久久| 一区二区三区在线不卡| 日韩中文字幕第一页| 国产视频中文字幕| 日韩欧美一二三四区| 日韩国产一区久久| 亚洲综合欧美在线| 亚洲美女视频一区| 中文字幕 乱码 中文乱码91| 国产视频二区| 国产日韩在线亚洲字幕中文| 欧美三级在线视频| 日韩中文字幕91| 日韩三级视频在线看| 久久婷婷国产| 日本亚洲视频在线| 一区二区三区在线|网站| av一级在线| 999在线视频|