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)...
詳細については、コメントと結果を参照してください.コードは次のとおりです.
//=====================================
// 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

C++ - 可变参数函数模板(Variadic Function Template) 详解 及 代码_第1张图片