Как я могу инициализировать массив 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;
}();