所以我有以下(减少)类:
template <typename A, typename... B>
struct ComponentTupleAccessor:
public ComponentArray<A>,
public ComponentTupleAccessor<B...>
{
ComponentTupleAccessor(const uint32_t capacity):
ComponentArray<A>(capacity),
ComponentTupleAccessor<B...>(capacity)
{}
};
template <typename A>
struct ComponentTupleAccessor<A>:
public ComponentArray<A>
{
ComponentTupleAccessor<A>(const uint32_t capacity):
ComponentArray<A>(capacity)
{}
};
template <typename A, typename ...B>
class ComponentTuple {
ComponentTupleAccessor<A, B...> m_Components;
uint32_t m_Capacity;
public:
ComponentTuple(const RB32u capacity):
m_Capacity{capacity},
m_Components(capacity)
{}
template <typename S, typename ...T>
void pop_back() {
m_Components.Component<S>::pop_back();
pop_back<T...>();
}
template <typename S>
void pop_back() {
m_Components.Component<S>::pop_back();
}
void pop_back() {
pop_back<A, B...>();
}
};
该类ComponentArray
基本上是一个包含一组特定类型组件的向量的包装器。
该类ComponentBlockTupleAccessor
或多或少模拟了 std::tuple 的缩减版本,其中可以使用可变参数模板将任意数量的唯一类型ComponentArray
继承到类中。ComponentTuple
pop_back
函数 inComponentTuple
旨在递归地从每个s中取出pop_back
一个元素。ComponentArray
在课堂之外,ComponentTuple
我希望能够简单地调用类似的东西,compTupleInstance.pop_back()
并且所有ComponentArray
的都应该删除它们的最后一个元素。
我得到一个编译错误“重载'pop_back()'的调用不明确”pop_back();
我似乎无法弄清楚 A、B(包)、S 和 T(包)模板参数的组合,它可以为我提供所需的功能。我在这里想念什么?
编辑:这是一个简单的使用场景:
// ComponentTuple contains an int and a float ComponentArray with capacity 8.
ComponentTuple<int, float> dut(8);
// Push a set of new components to the ComponentArrays.
// This function has a similar structure to that of pop_back.
dut.push_back({8}, {3.141f});
// Another one
dut.push_back({4}, {2.718f});
// Remove the last element from all of the ComponentArrays.
dut.pop_back();
ComponentTuple 模板参数将始终是唯一类型,并且始终大于一。