运用模板在编译期间生成斐波那契数组。
首先定义fib(0) = 0, fib(1) = 1
具体实现如下
#include <array>
#include <iostream>

 //定义递归和结束条件
template<int N>
struct fib {
    static constexpr int value = fib<N - 1>::value + fib<N - 2>::value;
};

template<>
struct fib<0> {
    static constexpr int value = 0;
};

template<>
struct fib<1> {
    static constexpr int value = 1;
};

 //使用std::integer_sequence来接收 ...N序列, 函数参数本身不重要,是个空类,目的是用来接受模板的参数,而非函数的参数
template<size_t... N>
auto fibarr_core(std::integer_sequence<size_t, N...>) {
    return std::array{ fib<N>::value... }; //折叠表达式这里会展开为fib<N>::value, fib<N-1>::value, ... fib<0>::value
}

 //代理调用,简化接口,用make_integer_sequence来生成...N序列
template<size_t N>
auto fibarr() {
    return fibarr_core<>(std::make_integer_sequence<size_t, N>{});
}

int main() {    
    auto arr = fibarr<10>();
    for (int value : arr) {
        std::cout << value << std::endl;
    }
    return 0;
    /*
    0 
    1 
    1 
    2 
    3 
    5 
    8 
    13 
    21 
    34
    */

}

 

最后修改日期: 2024年3月19日

作者