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