2017-07-11 5 views
3

二項係数を計算するためのテンプレートが見つかりました。利点は、派生多項式(ちょうど5つの非常に単純なもの)を使用する代わりに、このテンプレートをコンパイル時のBernstein多項式生成に使用することです。バリデーションテンプレートを簡略化する:いくつかのスペシャライゼーションを削除する

私は当初、5つのランダム関数の生成が明らかになったので、これを行うことでコードがより簡単になると考えました。残念ながら、以下のコードはテンプレートに慣れていない人には読みにくいです。少なくともいくつかのテンプレートの特殊化を取り除く方法はありますか?あなたはおそらくconstexprの機能を使用する場合があります

// 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; 
}; 
+2

:ここC++ 11やさしいバージョンです。私はこのコードはまったく読みにくく、実際にはきれいだとは思わない。 –

+1

Constexpr関数? – Quentin

+0

もしあなたがテンプレートを保持したいと思うなら(いくつか示唆しているように、より読みやすいconstexpr関数には向かない)、私は 'binomial <0, 0>'が 'binomial 'の特殊なケースだと信じています。したがって、特殊化の数を2に減らすことができます。 –

答えて

4

。任意のテンプレートコードテンプレートを知らない人のために読みにくいことになるだろう

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

+0

実行時に「誤用」され、計算される可能性があるため、 'constexpr'関数は注意してください:' std :: cout << factorial(5) 'vs' constexpr auto fac_5 =階乗(5); ' – Jarod42

関連する問題