Как разбить кортеж?

Учитывая

   template<typename First, typename... Tail>
   struct something
   {
       std::tuple<First, Tail...> t;
   };

Как я могу получитьstd::tuple<Tail...> который содержит все элементы изt кроме первого?

Я думаю, что это интересный вопрос в целом, но вот моя мотивация для контекста:

Я хотел бы реализовать хэш для кортежей. я использовалэтот ответ в качестве основы. Я обнаружил, что в нем произошла ошибка, а именно не звонилoperator() хеш-объекта со значением:

return left() ^ right();

Должно быть:

return left(std::get<0>(e)) ^ right(???);

??? будут оставшимися элементами кортежа для продолжения рекурсивного создания шаблона. Вот полный код, включая завершающую часть:

#include <functional>
#include <utility>

namespace std
{

template<typename First, typename... Tail>
struct hash<std::tuple<First, Tail...>>
{
    typedef size_t result_type;
    typedef std::tuple<First, Tail...> argument_type;

    result_type operator()(argument_type const& e) const
    {
        std::hash<First> left;
        std::hash<std::tuple<Tail...>> right;
        return left(std::get<0>(e)) ^ right(???);
    }
};

template<>
struct hash<std::tuple<>>
{
    typedef size_t result_type;
    typedef std::tuple<> argument_type;

    result_type operator()(argument_type const& e) const
    {
        return 1;
    }
};

}

Ответы на вопрос(6)

Ваш ответ на вопрос