gpt4 book ai didi

c++ - 有没有办法使用相同的索引遍历std::tuple和std::array?

转载 作者:行者123 更新时间:2023-12-03 16:09:35 26 4
gpt4 key购买 nike

我正在编写一个简单的实体组件系统框架,在该框架中,我想使用可变参数模板来获得更灵活的界面。对于每个组件,我都有(从块内存的开头开始)存储在std::array中的偏移量。在我的“update()”方法中,我想从此数组读取偏移量,将其添加到块的指针中,然后将指针(指向特定组件)直接传递给lambda作为参数。我尝试使用std::index_sequence,但无法同时将此索引用作元组和数组的索引。
在此先感谢您的帮助。

    template<typename ...Cn>
class SystemGroup {
public:
using OffsetArray = std::array<uint16_t, sizeof...(Cn)>;

static constexpr size_t kMaxGroups = 16;
static constexpr GroupIndex kInvalidIndex = -1;

struct Group {
static constexpr uint8_t kNumComponents = sizeof...(Cn);

OffsetArray componentOffsets;
Chunk *pFirstChunk;
};
};

template<typename ...Cn>
void SystemGroup<Cn...>::update() {
for (auto group : m_groups) {
// iterate over archetype's chunks
ecs::Chunk *pChunk = group.pFirstChunk;
do {
// get component data
std::tuple<Cn*...> pointers;

// Here is the problem. I don't know how to iterate over tuple and array using variadic templates
// pointers[0] = pChunk->memory + m_groups.componentOffsets[0];
// pointers[1] = pChunk->memory + m_groups.componentOffsets[1];
// pointers[sizeof..(Cn)] = pChunk->memory + m_groups.componentOffsets[sizeof..(Cn)];

auto updateComponents = [](int *pIntegers, float *pFloats) {
};
std::apply(updateComponents, pointers);
pChunk = pChunk->header.pNext;
} while(pChunk);
}
}
编辑
谢谢大家的帮助。我决定选择由max66提出的解决方案。当然,我拆分了lambda的定义和调用,以使其更具可读性。

最佳答案

添加一些辅助功能:

template <typename Integer, Integer ...I, typename F>
constexpr void constexpr_for_each(std::integer_sequence<Integer, I...>, F &&func)
{
(func(std::integral_constant<Integer, I>{}) , ...);
}

template <auto N, typename F>
constexpr void constexpr_for(F &&func)
{
if constexpr (N > 0)
constexpr_for_each(std::make_integer_sequence<decltype(N), N>{}, std::forward<F>(func));
}
然后,您可以执行以下操作:
constexpr_for<sizeof...(Cn)>([&](auto index)
{
constexpr auto i = index.value;
std::get<i>(pointers) = pChunk->memory + m_groups.componentOffsets[i];
});

关于c++ - 有没有办法使用相同的索引遍历std::tuple和std::array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66661860/

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