我正在尝试实现一个可以返回其模板参数总和的模板。模板参数的数量各不相同,因此我想制作一个接受参数包的可变参数模板。我能够创建一个功能模板,可以执行以下操作:
Sum(1,2,3)
但我也希望能够做到这样的事情:
Sum<1,2,3>())
有人可以解释我如何提取这些模板参数并将这些参数的总和存储在类似结构的东西中吗?
谢谢!
答案 0 :(得分:4)
您可以使用可变参数模板,模板特化和编译时递归。
// Forward-declaration of a `Sum` variadic template class
// that takes some integers as template parameters
template<int...>
struct Sum;
// Case 0: variadic template pack is not empty
// (match one integer `TX` and any remaining integers `TXs...`)
// (`TXs...` can be empty)
template<int TX, int... TXs>
struct Sum<TX, TXs...>
: std::integral_constant<int, TX + Sum<TXs...>::value>
{
};
// Case 1: variadic template pack is empty
template<>
struct Sum<>
: std::integral_constant<int, 0>
{
};
int main()
{
assert(Sum<1, 2, 3>::value == 6);
}
另外,如果你有一个已经工作的constexpr
函数getSum(...)
,你可以用结构包装它:
template<int... TXs>
struct Sum
{
constexpr static int value{getSum(TXs...)};
};