Как я могу инициализировать массив constexpr со значениями, используя std::generate

Например, если бы я хотел constexpr std::array<int,100>инициализирован со всеми кратными 3 от 1 до 300 во время компиляции, как я могу это сделать?

Моей первой мыслью было использовать std::generate, что-то вроде:

      constexpr std::array<int,100> a { std::generate(a.begin(), a.end(), [n=0]()mutable{ return n+=3; });

Я получаю сообщение об ошибке, например <source>:9:52: error: void value not ignored as it ought to be

и я не могу использовать std::generate после этого, потому что, конечно, в этот момент он только для чтения

Спасибо за любую помощь

2 ответа

Вы можете использовать index_sequence:

      template <size_t ... Indices>
constexpr auto gen(std::index_sequence<Indices...>) {
    return std::array<int,100>{ (Indices * 3)... };
}

int main() {
    constexpr std::array<int,100> a = gen(std::make_index_sequence<100>());
}

Хитрость заключается в том, чтобы поместить код в немедленно вызываемую лямбду. Тогда не имеет значения, используете ли вы std::generateили простой цикл:

      constexpr std::array<int,100> a = []{
    std::array<int,100> ret{};
    std::generate(ret.begin(), ret.end(),  [n=0]() mutable {return n += 3;});
    return ret;
}();
      constexpr std::array<int,100> a = []{
    constexpr std::array<int,100> ret{};
    for (std::size_t i = 0; i < ret.size(); i++)
        ret[i] = 3 * (1+i);
    return ret;
}();
Другие вопросы по тегам