Ответы пользователя по тегу Метапрограммирование
  • Можно ли инициализировать статический массив алгоритмом?

    В 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.

    Ограничения:
    1. В C++14 не предусмотрели constexpr для std::array::operator[]. Обещают исправить в C++17, а пока имеем костыль в виде функции at.
    2. Ни одна из текущих версий Visual Studio не способна скомпилировать данный код. M$ не дружит с constexpr.
    Ответ написан