简体   繁体   English

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

[英]How to initialise one array using another constexpr array in a static manner

I have a constexpr array like this: 我有一个像这样的constexpr数组:

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

I would like to do something akin to: 我想做些类似的事情:

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));
}

However, as the variable is used as a template parameter, so that won't work. 但是,由于该变量用作模板参数,因此无法使用。 I have ended up doing this: 我最终这样做了:

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))
};

And this works, but is relying on me not changing the number of elements in the BASES_TO_CHECK without also manually updating the part of the code where calc array is initialised. 这行得通,但要依靠我不更改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()>{});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM