1.可変長パラメーターテンプレートの定義
C ++ 11以降、C ++は可変長パラメーターテンプレートのサポートを開始し、任意の数とタイプのテンプレートパラメーターを許可し、パラメーターを定義するときにパラメーターの数を修正する必要はありません。その形式は次のように定義されます。
template<typename... Ts> class Variadic;
そのテンプレートのインスタンス化:
1.0個のパラメーターを持つテンプレートクラスVariadic <> zero;
2.マルチパラメータテンプレートクラスVariadic <int、double、std :: string、std :: list <int >>サンプル;
次のように定義されている、少なくとも1つのパラメーターを必要とするテンプレートクラスを定義することもできます。
template<typename T, typename... Args> class Variadic;
2.可変長パラメータの特徴的な識別
1.可変長パラメータの数を取得します
ツール:sizeof .. ..
#include <iostream>
using namespace std;
template<typename... Args>
void func(Args... args)
{
cout << "the count of 'args': " << sizeof...(args) << endl;
}
int main(int agrc, char* argv[])
{
func();
func(1);
func(1, 2);
func(1, 2, 3);
return 0;
}
プログラム標準出力:
the count of 'args': 0
the count of 'args': 1
the count of 'args': 2
the count of 'args': 3
2.開梱
1.再帰テンプレート関数
テンプレートパラメーターを関数に再帰的に渡して、すべてのテンプレートパラメーターを再帰的にトラバースするという目的を達成します。
#include <iostream>
template<typename T0>
void my_printf(T0 value)
{
std::cout << value << std::endl;
}
template<typename T, typename... Ts>
void my_printf(T value, Ts... args)
{
std::cout << value << std::endl;
my_printf(args...);
}
int main()
{
my_printf(1, 1000, "123", 1.123, "HahaahaH");
return 0;
}
プログラム標準出力:
1
1000
123
1.123
HahaahaH
2.可変パラメータテンプレートの拡張
テンプレートパラメータを再帰的に解凍するのは、書くのが少し面倒です。C ++ 17は、可変パラメーターテンプレートの拡張のサポートを開始しました。上記の例の実装は、次のコードに置き換えることができます。
template<typename T, typename... Ts>
void my_printf(T value, Ts... args)
{
std::cout << value << std::endl;
if constexpr(sizeof...(args) > 1)
my_printf(args...);
}
3.初期化リストの拡張
カンマ式とstd :: initializer_listの特性を使用します。
template<typename T, typename... Ts>
void my_printf(T value, Ts... args)
{
std::cout << value << std::endl;
(void)std::initializer_list<T>{([&args]{
std::cout << args << std::endl;
}(), value)...};
}
4.折りたたみ式
C ++ 17がサポートを開始しました(実際、C ++コンパイラは変数パラメータタイプをプッシュする機能を強化しました)。次のコードは、n個のデータの合計を実装します。
#include <iostream>
template<typename ... T>
auto sum(T ... t)
{
return (t + ...);
}
int main()
{
std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
return 0;
}
平均を見つける:
#include <iostream>
template<typename ... T>
auto average(T ... t)
{
return (t + ...)/sizeof...(t);
}
int main()
{
std::cout << average(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
return 0;
}