#include <typeinfo>
#include <iostream>

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;
};

template <typename TypeList>
struct type_list_last_element;

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

int main()
{
   typedef type_list<int, float, char> list;
   typedef type_list_first_element<list>::type first;
   std::cout << typeid(first).name() << std::endl;
   typedef type_list_last_element<list>::type last;
   std::cout << typeid(last).name() << std::endl;
   return 0;
}