Я пытаюсь создать какой-то инструмент для создания списка типов на основе комбинаций других типов.
Допустим, у нас есть три типа
struct A{};
struct B{};
struct C{};
Я хочу получить список кортежей, в котором есть все возможные комбинации из N типов A, B или C.
Для случая N = 2 это будет
std::tuple<A,A>
std::tuple<A,B>
std::tuple<A,C>
std::tuple<B,A>
std::tuple<B,B>
std::tuple<B,C>
std::tuple<C,A>
std::tuple<C,B>
std::tuple<C,C>
Идея состоит в том, чтобы создать кортеж, который содержит контейнер для всех этих типов, поэтому позже я смогу сохранить любой из этих типов в списке контейнеров.
template <typename ...Combinations>
using CombinationList = std::tuple<std::vector<Combinations>...>;
У меня уже есть механизм для вставки конкретного элемента внутрь контейнера, в который он помещается, но я понятия не имею, как создавать комбинации.
В комментариях люди предлагают использовать std::vector<Combination<std::variant<A,C,B>, std::variant<A,B,C>>>
. Хотя это технически решает проблему, я предпочитаю не использовать его, как A, BC и имеет очень разные размеры, и я не хочу посещать варианты во время выполнения. Кроме того, в какой-то момент мне нужно будет загрузить все данные в контейнерах в
std::tuple<std::vector<Combination>...>
в графический процессор, поэтому я не могу использовать std :: вариант здесь.
Как я мог это сделать?
Спасибо!
П.Д.: Это связано с этим вопросом. Комбинированный взрыв значения перечисления (729 комбинаций...). В этом вопросе я спросил, как можно легко генерировать типы, которые будут помещаться в контейнер. Теперь мне нужно создать контейнеры.