Итак, у меня есть следующие (урезанные) классы:
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
- это, по сути, оболочка для вектора, который содержит несколько компонентов определенногоtype.
Класс ComponentBlockTupleAccessor
более или менее эмулирует урезанную версию std :: tuple, где любое количество уникальных типов ComponentArray
может быть унаследовано в классе ComponentTuple
с использованием шаблонов переменных.
Функция pop_back
в ComponentTuple
предназначена для рекурсивного pop_back
элемента от каждого из ComponentArray
s.
За пределами класса ComponentTuple
, который я быхотелось бы просто вызывать что-то вроде compTupleInstance.pop_back()
, и у всех ComponentArray
должны быть удалены последние элементы.
Я получаю ошибку компиляции "вызов перегруженного pop_back () 'неоднозначен" pop_back();
Кажется, я не могу определить комбинацию параметров шаблона A, B (pack), S и T (pack), которая дает мне необходимую функциональность. Что мне здесь не хватает?
Редактировать: Вот простой сценарий использования:
// 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 всегда будут уникальными типами, и их всегда будет больше единицы.