Хранение разных типов std :: tuple в массиве, векторе или? - PullRequest
0 голосов
/ 12 марта 2019

Есть ли способ в последней версии C ++ (я думаю, 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 ++?Я работаю над проектом автоматического вызова метода.У меня есть кое-что, что в основном работает, но это сделало бы это чище.

1 Ответ

2 голосов
/ 13 марта 2019

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

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

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

...