Wie spalte ich ein Tupel?

Angenommen

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

Wie bekomme ich einestd::tuple<Tail...> das enthält alle Elemente aust außer dem ersten?

Ich denke, das ist eine interessante Frage im Allgemeinen, aber hier ist meine Motivation für den Kontext:

Ich möchte einen Hash für Tupel implementieren. ich benutztediese Antwort als Grundlage. Ich habe festgestellt, dass ein Fehler aufgetreten ist, nämlich, dass ich nicht angerufen habeoperator() des Hash-Objekts mit einem Wert:

return left() ^ right();

Sollte sein:

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

Das ??? wären die verbleibenden Elemente des Tupels, um die rekursive Instanziierung der Vorlage fortzusetzen. Hier ist der vollständige Code einschließlich des Kündigungsteils:

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

}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage