在 C++ 中提取和操作模板参数
Extract and manipulate template arguments in C++
我正在尝试实现一个模板,该模板可以 return 其模板参数的总和。模板参数的数量各不相同,因此我想制作一个接受参数包的可变参数模板。我能够制作一个可以执行以下操作的函数模板:
Sum(1,2,3)
但我也希望能够做类似的事情:
Sum<1,2,3>())
有人可以解释我如何提取这些模板参数并将这些参数的总和存储在类似于结构的东西中吗?
已经谢谢了!
您可以使用可变参数模板、模板特化和编译时递归。
// 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...)};
};
我正在尝试实现一个模板,该模板可以 return 其模板参数的总和。模板参数的数量各不相同,因此我想制作一个接受参数包的可变参数模板。我能够制作一个可以执行以下操作的函数模板:
Sum(1,2,3)
但我也希望能够做类似的事情:
Sum<1,2,3>())
有人可以解释我如何提取这些模板参数并将这些参数的总和存储在类似于结构的东西中吗?
已经谢谢了!
您可以使用可变参数模板、模板特化和编译时递归。
// 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...)};
};