C/C++可變參數(shù)函數(shù)的實(shí)現(xiàn)
一、變長(zhǎng)參數(shù)函數(shù)
頭文件:#include <stdarg.h>
函數(shù)聲明
int add(int count, ...);
函數(shù)定義
int add(int count, ...)
{
va_list va;
va_start(va, count);
int sum = 0;
for (int i = 0; i < count; i++)
sum += va_arg(va, int);
va_end(va);
return sum;
}
函數(shù)調(diào)用
int main()
{
cout<<add(5, 1, 2, 3, 4, 5)<<endl;//輸出15
return 0;
}
二、C++11的新特性,變長(zhǎng)參數(shù)模板。
邊長(zhǎng)參數(shù)模板相當(dāng)于一個(gè)模板的遞歸展開(kāi)模型,但是它不是遞歸的。使用的時(shí)候,要定義一個(gè)“遞歸”的出口,然后定義一系列的操作,操作的是以“遞歸”的方式進(jìn)行的。
遞歸函數(shù)方式展開(kāi),模板推導(dǎo)的時(shí)候,一層層遞歸展開(kāi),最后到?jīng)]有參數(shù)時(shí)用定義的一般函數(shù)終止。
void test()
{
cout << "test()" << endl;
}
template < class T, class... Args>
void test(T first, Args... args)
{
cout << typeid(T).name() << " " << first <<endl;
test(args...);
}
test<int, int, long>(1, 2, 3L);
//輸出
int 1
int 2
long 3
test()
嗯?第一個(gè)test()應(yīng)該是作為test函數(shù)遞歸調(diào)用的結(jié)尾。再測(cè)試一下
template < class T>
void test(const T &t)
{
cout << "test()"<<t << endl;
}
template < class T, class... Args>
void test(T first, Args... args)
{
cout << typeid(T).name() << " " << first <<endl;
test(args...);
}
//輸出
int 1
int 2
test()3
這。。。。好像是通過(guò)第一個(gè)test來(lái)控制在哪里結(jié)束。
最后寫一個(gè)正經(jīng)的累加器:
#include <iostream>
#include <stdarg.h>
using namespace std;
template<typename T>
int add(const T& t)
{
return t;
}
template<typename T, typename ...Args>
int add(const T& t, const Args&... args)
{
return t + add(args...);
}
int main() {
auto res = add(2, 3, 3);
std::cout << res << std::endl;
system("pause");
return 0;
}
//輸出結(jié)果 8
三、參考
關(guān)于可變參數(shù)類模板、右值引用和完美轉(zhuǎn)發(fā)的內(nèi)容可以參考這篇博客http://www.dhdzp.com/article/95152.htm,有時(shí)間再研究下后面怎么做。
到此這篇關(guān)于C/C++可變參數(shù)函數(shù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C/C++可變參數(shù)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文詳解如何在VS?Code上搭建C/C++開(kāi)發(fā)環(huán)境
VSCode是由微軟開(kāi)發(fā)的一款免費(fèi)、開(kāi)源、跨平臺(tái)的文本編輯器,它具有許多強(qiáng)大的功能,這篇文章主要給大家介紹了關(guān)于如何在VS?Code上搭建C/C++開(kāi)發(fā)環(huán)境的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
C語(yǔ)言實(shí)現(xiàn)任何文件的加密解密功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)任何文件的加密解密功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
老生常談C語(yǔ)言動(dòng)態(tài)函數(shù)庫(kù)的制作和使用(推薦)
下面小編就為大家?guī)?lái)一篇老生常談C語(yǔ)言動(dòng)態(tài)函數(shù)庫(kù)的制作和使用(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
C語(yǔ)言 module_init函數(shù)與initcall案例詳解
這篇文章主要介紹了C語(yǔ)言 module_init函數(shù)與initcall案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

