В C++14 для этого есть constexpr-функции:
#include <iostream>
#include <array>
template<typename T, size_t n>
constexpr T& at(std::array<T, n>& a, size_t i) {
return const_cast<T&>(static_cast<const std::array<T, n>&>(a)[i]);
}
template<typename T, size_t n>
constexpr const T& at(const std::array<T, n>& a, size_t i) {
return a[i];
}
constexpr std::array<int, 20> generate_fib() {
auto result = std::array<int, 20>{};
for (size_t i = 0; i < 20; ++i) {
if (i < 2) {
at(result, i) = 1;
} else {
at(result, i) = at(result, i-1) + at(result, i-2);
}
}
return result;
}
constexpr static const auto fib = generate_fib();
int main()
{
for (auto elem : fib) {
std::cout << elem << ' ';
}
return 0;
}
Скомпилировать онлайн на GCC6.
Ограничения:
- В C++14 не предусмотрели constexpr для std::array::operator[]. Обещают исправить в C++17, а пока имеем костыль в виде функции at.
- Ни одна из текущих версий Visual Studio не способна скомпилировать данный код. M$ не дружит с constexpr.