1. 程式人生 > 程式設計 >C/C++可變引數函式的實現

C/C++可變引數函式的實現

一、變長引數函式

標頭檔案:#include <stdarg.h>

函式宣告

int add(int count,...); 

函式定義

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;
}

函式呼叫

int main()
{
 
 cout<<add(5,1,2,3,4,5)<<endl;//輸出15
 return 0;
}

二、C++11的新特性,變長引數模板。

邊長引數模板相當於一個模板的遞迴展開模型,但是它不是遞迴的。使用的時候,要定義一個“遞迴”的出口,然後定義一系列的操作,操作的是以“遞迴”的方式進行的。

遞迴函式方式展開,模板推導的時候,一層層遞迴展開,最後到沒有引數時用定義的一般函式終止。

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,3L);
//輸出
int 1
int 2
long 3
test()

嗯?第一個test()應該是作為test函式遞迴呼叫的結尾。再測試一下

template < class T>
 void test(const T &t)
 {
 cout << "test()"<<t << endl;
 }

 template < class T,Args... args)
 {
   cout << typeid(T).name() << " " << first <<endl;
   test(args...);
 }
 //輸出
int 1
int 2
test()3

這。。。。好像是通過第一個test來控制在哪裡結束。

最後寫一個正經的累加器:

#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);
 std::cout << res << std::endl;
 system("pause");
 return 0;
}
//輸出結果 8

三、參考

關於可變引數類模板、右值引用和完美轉發的內容可以參考這篇部落格https://www.jb51.net/article/95152.htm,有時間再研究下後面怎麼做。

到此這篇關於C/C++可變引數函式的實現的文章就介紹到這了,更多相關C/C++可變引數函式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!