Предположим, я хочу написать структуру, которая имеет член constexpr std :: array, который содержит первые N fibs, где N - аргумент шаблона.
Примерно так, но vals доступен во время компиляции:
template <int N>
struct first_n_fibs {
static_assert(N>0);
static const std::array<int, N> vals;
static std::array<int, N> init_fibs(){
std::array<int,N> result;
if (N==1) {
return std::array<int,N>{1};
} else {
result[0]=1;
result[1]=1;
for(int i =2; i<N;++i) {
result[i]=result[i-2]+result[i-1];
}
}
return result;
}
};
template<int N>
const std::array<int, N> first_n_fibs<N>::vals=init_fibs();
int main(){
std::cout << first_n_fibs<2>::vals.back() << std::endl;
std::cout << first_n_fibs<5>::vals.back() << std::endl;
std::cout << first_n_fibs<6>::vals.back() << std::endl;
}
Я подозреваю, что нет никакого обходного пути, так как конструкторы std :: array не являются constexpr, поэтому, если кто-то знает какие-либо обходные пути, включающие массивы C или boost, я был бы рад этому.