元编程一窥
题目描述
强烈建议先完成《初识模板特化》题目。
类模板 Fibonacci
接受一个 int
模板参数。类模板中有一个静态常量成员 value
;Fibonacci<N>::value
应当是斐波那契数列第 n 项的值。
若没有思路的话,请看提示。
关于输入
无
关于输出
见样例输出
参考答案
#include <iostream>
template <int N>
struct Fibonacci {
public:
constexpr static int value = Fibonacci<N - 1>::value + Fibonacci<N - 2>::value;
};
template <>
struct Fibonacci<0> {
public:
constexpr static int value = 0;
};
template <>
struct Fibonacci<1> {
public:
constexpr static int value = 1;
};
int main() {
const int f[6]{
Fibonacci<1>::value,
Fibonacci<2>::value,
Fibonacci<3>::value,
Fibonacci<4>::value,
Fibonacci<5>::value,
Fibonacci<6>::value,
};
for (int i = 0; i < 6; i++) {
std::cout << f[i] << " ";
}
// 静态断言:编译器检查条件是否成立。不成立时引发编译错误
static_assert(Fibonacci<30>::value == 832040);
}
// 检查斐波那契数列前三十项的和是否正确
template<std::size_t... Ns>
constexpr int check(std::index_sequence<Ns...>) {
return (0 + ... + Fibonacci<Ns>::value);
}
static_assert(check(std::make_index_sequence<30>{}) == 1346268);