したがって、テンプレート構造関数があるとしますfib<i>::value
。実行時に n 番目のフィボナッチ数を取得したい。このために、配列を作成しますfibs[] = { fib<0>::value, ... , fib<maxN>::value }
。残念ながら、一部の関数maxN
は非常に大きくなる可能性があり、手だけでは埋めることができません。そこで、タスクを簡単にするためにいくつかのプリプロセッサ ディレクティブを作成しました。
#define fib(x) (fib<(x)>::value)
#define fibLine_level_0(x) fib(5*(x) + 0), fib(5*(x) + 1), fib(5*(x) + 2), fib(5*(x) + 3), fib(5*(x) + 4)
#define fibLine_level_1(x) fibLine_level_0(2*(x) + 0), fibLine_level_0(2*(x) + 1)
#define fibLine_level_2(x) fibLine_level_1(2*(x) + 0), fibLine_level_1(2*(x) + 1)
#define fibLine_level_3(x) fibLine_level_2(2*(x) + 0), fibLine_level_2(2*(x) + 1)
#define cAarrSize(x) (sizeof(x) / sizeof(x[0]))
そして、私はそれを次のように使用します:
int fibs[] = { fibLine_level_3(0) };
for (int i = 0; i < cAarrSize(fibs); i++)
cout << "fib(" << i << ") = " << fibs[i] << endl;
必要なコード:
template<int i>
struct fibPair{
static const int fst = fibPair<i-1>::snd;
static const int snd = fibPair<i-1>::fst + fibPair<i-1>::snd;
};
template<>
struct fibPair<0> {
static const int fst = 0;
static const int snd = 1;
};
template<int i>
struct fib {
static const int value = fibPair<i>::fst;
};
しかし、このコードは本当に醜いです。もっと綺麗にするにはどうしたらいいですか?
制約: このコードはスポーツ プログラミングで使用する必要があります。つまり、サードパーティのライブラリはなく、場合によっては C++11 もありません (ただし、そうなる可能性があります)。