运用模板在编译期间生成斐波那契数组。
首先定义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 */ }