转载:https://www.jianshu.com/p/b56d59f77d53
// 注意声明变长参数时...在参数名前面,而对其使用时...在参数名后面。
template<typename ...Numbers> struct Sum;
template<typename Number, typename ...LeftNumbers>
struct Sum<Number, LeftNumbers...>
{
using Result = typename Add<Number, typename Sum<LeftNumbers...>::Result>::Result;
};
// 参数个数没有,否则递归展开参数
template<> struct Sum<>
{
using Result = IntType<0>;
};
#define __sum(...) typename Sum<__VA_ARGS__>::Result
//
__sum(); // 返回 IntType<0>
__sum(__int(1), __int(2), __int(5)); // 返回 IntType<8>