Хранение различных типов std::tuple в массиве, векторе или?

Есть ли способ в последней версии С++ (я думаю, 17 или 20) хранить различные виды кортежей в std::array или std::vector или другом встроенном типе данных? Например, может быть что-то вроде ->

struct bunchOfTuples {
    std::tuple<float, float, int, int> firstTup = std::make_tuple(float, float, int, int);
    std::tuple<float, float, int> secondTup = std::make_tuple(float, float, int); };
    // bunch more tuples of differing types
};

Есть ли способ использовать шаблоны для достижения чего-то подобного? Или реализация класса или структуры? Или по-другому я не думал, что я новичок в последних вещах C++? Я работаю над проектом автоматического вызова метода. У меня есть что-то, что в основном работает, но это сделает его чище.


person Adam Freeman    schedule 12.03.2019    source источник
comment
std::variant или какое-то стирание типов помогло бы, но вы не можете хранить разнородные типы в однородных контейнерах.   -  person user975989    schedule 12.03.2019
comment
Почему бы не сделать кортеж из кортежей? Вы можете получить доступ к отдельным элементам из числового индекса, используя std::get   -  person alter igel    schedule 12.03.2019


Ответы (1)


Массивы, векторы и вообще все стандартные контейнеры однородны. Это означает, что все элементы контейнера имеют одинаковый тип. Разные экземпляры шаблона std::tuple — это разные классы. Таким образом, они не могут храниться в одном массиве.

C++ имеет разнородные оболочки: std::variant и std::any. Вариант — это реализация объединения с тегами. Его можно использовать для хранения объекта из заранее определенного списка типов. any — это типобезопасная оболочка для void*. он может хранить объект любого типа. Итак, вам может пригодиться контейнер variant или any.

Однако это инструменты только низкого уровня, а для более функциональной гетерогенной обработки существуют существующие библиотеки, такие как Boost.Hana.

person eerorika    schedule 12.03.2019