0

例如,如果我想constexpr std::array<int,100>在编译时使用 1-300 的所有 3 的倍数进行初始化,我该怎么做?

我的第一个想法是使用 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 因为当然,它在那个时候是只读的

谢谢你的帮助

4

2 回答 2

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>());
}
于 2021-03-10T21:12:40.853 回答
0

诀窍是将代码放入立即调用的 lambda 中。那么使用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;
}();
于 2021-03-10T21:18:00.620 回答