简化可变参数模板:删除一些专用项

Simplify variadic template: Remove some specializations

本文关键字:删除 专用 变参 参数      更新时间:2023-10-16

我找到了一个模板来计算二项式系数,我很高兴地将其用于函数生成。优点是我使用此模板进行编译时伯恩斯坦多项式生成,而不是使用派生多项式(只有 5 个非常简单的多项式(。

我最初认为这样做代码会变得更容易,因为五个随机函数的生成现在很明显。不幸的是,下面的代码对于不习惯模板的人来说很难阅读。有没有办法摆脱至少一些模板专业化?

// Template functions to estimate the binominal coefficient
template<uint8_t n, uint8_t k>
struct binomial {
static constexpr int value = (binomial<n - 1, k - 1>::value + binomial<n - 1, k>::value);
};
template<>
struct binomial<0, 0> {
static constexpr int value = 1;
};
template<uint8_t n>
struct binomial<n, 0> {
static constexpr int value = 1;
};
template<uint8_t n>
struct binomial<n, n> {
static constexpr int value = 1;
};

你可能会使用constexpr函数。这是C++11友好的版本:

constexpr int factorial(int n)
{
return (n == 1) ? 1 : n * factorial(n - 1);
}
constexpr int bin_coeff(int n, int k)
{
return factorial(n) / factorial(n - k) / factorial(k);
}