Parameter pack argument consumption

Posted by yuri kilochek on Stack Overflow See other posts from Stack Overflow or by yuri kilochek
Published on 2012-09-16T10:35:57Z Indexed on 2012/09/19 15:39 UTC
Read the original article Hit count: 162

Filed under:
|

It is possible to get the first element of the parameter pack like this

template <typename... Elements>
struct type_list
{
};

template <typename TypeList>
struct type_list_first_element
{
};

template <typename FirstElement, typename... OtherElements>
struct type_list_first_element<type_list<FirstElement, OtherElements...>>
{
    typedef FirstElement type;
};

int main()
{
   typedef type_list<int, float, char> list;
   typedef type_list_first_element<list>::type element;
   return 0;
}

but not possible to similary get the last element like this

template <typename... Elements>
struct type_list
{
};

template <typename TypeList>
struct type_list_last_element
{
};

template <typename LastElement, typename... OtherElements>
struct type_list_last_element<type_list<OtherElements..., LastElement>>
{
    typedef LastElement type;
};

int main()
{
   typedef type_list<int, float, char> list;
   typedef type_list_last_element<list>::type element;
   return 0;
}

with gcc 4.7.1 complaining:

error: 'type' in 'struct type_list_last_element<type_list<int, float, char>>' does not name a type

What paragraps from the standard describe this behaviour?

It seems to me that template parameter packs are greedy in a sense that they consume all matching arguments, which in this case means that OtherElements consumes all three arguments (int, float and char) and then there is nothing left for LastElement so the compilation fails. Am i correct in the assumption?

EDIT:

To clarify: I am not asking how to extract the last element from the parameter pack, i know how to do that. What i actually want is to pick the pack apart from the back as opposed to the front, and as such recursing all the way to the back for each element would be ineffective. Apparentely reversing the sequence beforehand is the most sensible choice.

© Stack Overflow or respective owner

Related posts about c++

Related posts about variadic-templates