Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert std::array to std::tuple? [duplicate]

Tags:

c++

arrays

tuples

I am working on a aux module to pass values between polymorphic objects and at some point I have

std::array<void*, N>

and need to send forward

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

I can figure some solution with the use of index_sequence or/and recursions, but all of those look bulky and difficult to read.
Is there any more straightforward way to do this by the means of the standard library?

Also, just in case - am I right that the layout of std::array is a dense set of respective objects, thus equal to, lets say, void** of respective length, whereas the layout of tuple allows gaps?

like image 897
Glib Avatar asked Aug 15 '19 13:08

Glib


1 Answers

If your implementation supports it, you can use std::tuple_cat. Under some implementations it concatenates any number of objects that respect the tuple interface (which std::array does) into a single flat tuple. Concatenating a single tuple like object will just produce a tuple that holds copies of the members of said source "tuple".

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

Also, just in case - am I right that the layout of std::array is a dense set of respective objects, thus equal to, lets say, void** of respective length, whereas the layout of tuple allows gaps?

A std::array is an aggregate the will hold a void*[N] internally. So yes, the elements will be without padding in between them. The layout of the tuple's elements is not specified to such an extent.

like image 146
StoryTeller - Unslander Monica Avatar answered Sep 28 '22 22:09

StoryTeller - Unslander Monica