简化可变参数模板:删除一些特化

时间:2017-07-11 07:59:41

标签: c++ c++11 templates template-meta-programming

我找到了一个计算二项式系数的模板,我很乐意用它来生成函数。优点是我使用这个模板进行编译时Bernstein多项式生成,而不是使用派生多项式(只有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;
};

1 个答案:

答案 0 :(得分:4)

您可能使用 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);
}

EXAMPLE