可变参数模板类,如元组:
template<class... Args>
class tuple;
递归和特化的方式展开参数包
//可变参数模板类前向声明
template<typename... Args>
struct Sum;
//定义展开参数的可变参数模板类
template<typename First, typename... Rest>
struct Sum<First, Rest...>
{
enum{ value = Sum<First>::value + Sum<Rest...>::value };
};
//可变参数模板类的特化,递归的终止类
template<typename Last>
struct Sum<Last>
{
enum { value = sizeof(Last) };
};
cout << Sum<int, double, short>::value << endl; //14
也可以省去前向声明:
template<typename First, typename... Rest>
struct Sum
{
enum{ value = Sum<First>::value + Sum<Rest...>::value };
};
template<typename Last>
struct Sum<Last>
{
enum { value = sizeof(Last) };
};
还可以使用std::integral_constant消除枚举中value的定义
//前向声明
template<typename... Args>
struct Sum;
//定义
template<typename First, typename... Rest>
struct Sum<First, Rest...>:std::integral_constant<int, Sum<First>::value +
Sum<Rest...>::value>
{
};
//递归终止
template<typename Last>
struct Sum<Last> :std::integral_constant<int, sizeof(Last)>
{
};
也可以通过继承的方式展开参数包
//整形序列的定义
template<int...>
struct IndexSeq
{
};
//继承方式展开参数包
template<int N, int... indexes>
struct MakeIndexes : MakeIndexes<N - 1, N - 1, indexes...>
{
};
//模板特化,终止展开参数包
template<int... indexes>
struct MakeIndexes<0, indexes...>
{
typedef IndexSeq<indexes...> type;
};
using T = MakeIndexes<3>::type;
cout << typeid(T).name() << endl; //struct IndexSeq<0,1,2>