Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Traversing nested C++11 tuple

If I have this tuple type:

std::tuple<int, string, std::tuple<...>, int>

How can I traverse it? I've been able to write functions that traverse a flat tuple, but not with nested tuples.

The problem seems to be for any implementation of a templated function or type that handles all the conceivable types in a nested tuple, there must be this case:

template<typename T>
void somefunc(T t)
{
    // Do something to t
}

Which ends up being the best choice for overload resolution for every type, and you can't recursively traverse the tuple because you lose the information that it's a tuple. If you try to write a class or function that tries to determine whether it's a tuple or not, you still run in to the "false" case which has the same problem as above in that it ends up matching for every type and the tuple specialized version gets overlooked.

Is there a way I'm not aware of to check whether something is a tuple?

like image 685
user2922709 Avatar asked Sep 09 '26 17:09

user2922709


1 Answers

Simply overload the someFunc() function for tuples and non-tuple types:

template<typename... Ts>
void someFunc( const std::tuple<Ts...>& tuple )
{
    /* traverse the elements of the tuple */
    traverse_tuple( tuple );
}

template<typename T>
void someFunc( const T& value )
{
    /* do something with the value */
}

Where traverse_tuple is the same function you have implemented to traverse non-nested (flat) tuples. It calls someFunc() for each member of the tuple.
For an implementation of a tuple traversing function, you could check this answer.

like image 51
Manu343726 Avatar answered Sep 11 '26 05:09

Manu343726