Как преобразовать std::array в std::tuple?

Я работаю над вспомогательным модулем для передачи значений между полиморфными объектами, и в какой-то момент у меня есть

std::array<void*, N>

и нужно отправить вперед

std::tuple<void*, void*, /* N times */>

Я могу найти какое-то решение с использованием index_sequence или/и рекурсий, но все они выглядят громоздкими и трудными для чтения.
Есть ли более простой способ сделать это с помощью стандартной библиотеки?

Кроме того, на всякий случай - правильно ли я, что компоновка std::array представляет собой плотный набор соответствующих объектов, таким образом, равный, скажем, void** соответствующей длины, тогда как компоновка кортежа допускает пробелы?

Ответы

Ответ 1

Если ваша реализация поддерживает это, вы можете использовать std::tuple_cat. В некоторых реализациях он объединяет любое количество объектов, которые относятся к интерфейсу кортежа (что делает std::array), в один плоский кортеж. Конкатенация одного объекта, подобного кортежу, просто создаст кортеж, содержащий копии членов указанного исходного кортежа.

std::array<void*, N> a;
auto b = std::tuple_cat(a);

Кроме того, на всякий случай - я прав, что компоновка std::array представляет собой плотный набор соответствующих объектов, таким образом, равный, скажем, void** соответствующей длины, тогда как компоновка кортежа допускает пробелы?

std::array - это совокупность, которая будет содержать void*[N] внутри. Так что да, элементы будут без отступов между ними. Компоновка элементов кортежа не указана в такой степени.