gpt4 book ai didi

c++ - 如何以静态方式使用另一个 constexpr 数组初始化一个数组

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:27 24 4
gpt4 key购买 nike

我有一个像这样的 constexpr 数组:

constexpr std::array<int, 4> BASES_TO_CHECK = { 8, 16, 32, 64 };

我想做一些类似于:

std::array<std::thread, BASES_TO_CHECK.size()> calc;
for(size_t i = 0; i<BASES_TO_CHECK.size(); ++i)
{
calc[i]=std::thread(calculate<BASES_TO_CHECK[i]>, std::ref(recordMap[BASES_TO_CHECK[i]]), std::ref(counterMap.at(BASES_TO_CHECK[i])), std::ref(done));
}

但是,由于变量被用作模板参数,所以这将不起作用。我最终这样做了:

std::array<std::thread, BASES_TO_CHECK.size()> calc = {
std::thread(calculate<BASES_TO_CHECK[0]>, std::ref(recordMap[BASES_TO_CHECK[0]]), std::ref(counterMap.at(BASES_TO_CHECK[0])), std::ref(done)),
std::thread(calculate<BASES_TO_CHECK[1]>, std::ref(recordMap[BASES_TO_CHECK[1]]), std::ref(counterMap.at(BASES_TO_CHECK[1])), std::ref(done)),
std::thread(calculate<BASES_TO_CHECK[2]>, std::ref(recordMap[BASES_TO_CHECK[2]]), std::ref(counterMap.at(BASES_TO_CHECK[2])), std::ref(done)),
std::thread(calculate<BASES_TO_CHECK[3]>, std::ref(recordMap[BASES_TO_CHECK[3]]), std::ref(counterMap.at(BASES_TO_CHECK[3])), std::ref(done))
};

这是有效的,但依赖于我不更改 BASES_TO_CHECK 中的元素数量,而无需手动更新初始化 calc 数组的代码部分。

最佳答案

template<std::size_t... i>
std::array<std::thread, BASES_TO_CHECK.size()> gen_impl(std::index_sequence<i...>) {
return {
std::thread(calculate<BASES_TO_CHECK[i]>,
std::ref(recordMap[BASES_TO_CHECK[i]]),
std::ref(counterMap.at(BASES_TO_CHECK[i])),
std::ref(done)
)...
};
}

auto calc = gen_impl(std::make_index_sequence<BASES_TO_CHECK.size()>{});

关于c++ - 如何以静态方式使用另一个 constexpr 数组初始化一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55369575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com