Como dividir uma tupla?

Dado um

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

Como posso obter umstd::tuple<Tail...> que contém todos os elementos det exceto o primeiro?

Eu acho que esta é uma questão interessante em geral, mas aqui está minha motivação para o contexto:

Eu gostaria de implementar um hash para tuplas. eu useiesta resposta como uma base. Eu descobri que houve um erro, ou seja, não ligaroperator() do objeto hash com um valor:

return left() ^ right();

Deveria estar:

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

O ??? seriam os elementos restantes da tupla para continuar a instanciação recursiva do modelo. Aqui está o código completo, incluindo a parte de terminação:

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

}

questionAnswers(6)

yourAnswerToTheQuestion