元编程一窥

题目描述

强烈建议先完成《初识模板特化》题目。

类模板 Fibonacci 接受一个 int 模板参数。类模板中有一个静态常量成员 valueFibonacci<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);