C++-可変パラメータ関数テンプレート(Variadic Function Template)の詳細とコード
可変パラメータ関数テンプレート(Variadic Function Template)の詳細とコード
本住所:http://blog.csdn.net/caroline_wendy/article/details/17076695
可変パラメータ関数テンプレート(variadic function template)は、主にパッケージ拡張(pack expansion)方式、すなわち「...」を使用します.
1つのモード(pattern)をパケット内の各要素(element)の形式に拡張する.
可変パラメータ関数テンプレートは、再帰(recursive)を使用してパケットパラメータを処理することがよくあります.
非可変パラメータ(nonvariadic)関数テンプレートが必要で、再帰を終了し、最後の呼び出し時に非可変パラメータバージョンが呼び出されると、再帰は終了します.
パケット内のいくつかの要素を処理し、パケット内の要素を再帰的に順次処理するバインド(bing)パラメータも必要である.
パッケージ拡張は、たとえば
関数のテンプレートパラメータ、たとえばtemplae
関数のパラメータテンプレート、たとえばcosnt Args&...rest
関数のパラメータ、たとえばrest...
関数テンプレート(debug_など)rep(rest)...
詳細については、コメントと結果を参照してください.コードは次のとおりです.
出力:
本住所:http://blog.csdn.net/caroline_wendy/article/details/17076695
可変パラメータ関数テンプレート(variadic function template)は、主にパッケージ拡張(pack expansion)方式、すなわち「...」を使用します.
1つのモード(pattern)をパケット内の各要素(element)の形式に拡張する.
可変パラメータ関数テンプレートは、再帰(recursive)を使用してパケットパラメータを処理することがよくあります.
非可変パラメータ(nonvariadic)関数テンプレートが必要で、再帰を終了し、最後の呼び出し時に非可変パラメータバージョンが呼び出されると、再帰は終了します.
パケット内のいくつかの要素を処理し、パケット内の要素を再帰的に順次処理するバインド(bing)パラメータも必要である.
パッケージ拡張は、たとえば
関数のテンプレートパラメータ、たとえばtemplae
関数のパラメータテンプレート、たとえばcosnt Args&...rest
関数のパラメータ、たとえばrest...
関数テンプレート(debug_など)rep(rest)...
詳細については、コメントと結果を参照してください.コードは次のとおりです.
//=====================================
// Name : CppPrimer.cpp
// Author : Caroline
// Version : 1.0
// Description : Example, UTF-8
//=====================================
/*eclipse cdt, gcc 4.8.1*/
#include <iostream>
#include <sstream>
using namespace std;
// bug
template <typename T> std::string debug_rep (const T& t)
{
std::ostringstream ret;
ret << t;
return ret.str();
}
//
template<typename T>
std::ostream &print(std::ostream &os, const T &t)
{
//std::cout << "This is nonvariadic function! ";
return os << t;
}
// , "..." (Pack Expansion)
template <typename T, typename... Args>
std::ostream &print(std::ostream &os, const T &t, const Args&... rest)
{
os << t << ", ";
return print(os, rest...);
}
//
template <typename... Args>
std::ostream &errorMsg(std::ostream &os, const Args&... rest)
{
return print(os, debug_rep(rest)...); //
}
int main()
{
int i(10); std::string s("girls");
//print(std::cout, i, s, 42);
errorMsg(std::cout, i, s, 10, "ladies");
return 0;
}
出力:
10, girls, 10, ladies