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, 2, 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, class... Args>
 void test(T first, 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, 3);
 std::cout << res << std::endl;
 system("pause");
 return 0;
}
//     8
三、参考
可変パラメータタイプのテンプレート、右値の参照と完璧な転送については、このブログhttps://www.jb51.net/article/95152.htmを参照してください。時間があれば、後でどうすればいいですか?
ここでC/C++可変パラメータ関数の実現に関する記事を紹介します。これに関連して、C/C++可変パラメータ関数の詳細を紹介します。以前の記事を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。