¿Cómo dividir una tupla?
Dado un
template<typename First, typename... Tail>
struct something
{
std::tuple<First, Tail...> t;
};
¿Cómo puedo obtener unstd::tuple<Tail...>
que contiene todos los elementos det
¿A excepción del primero?
Creo que esta es una pregunta interesante en general, pero aquí está mi motivación para el contexto:
Me gustaría implementar un hash para tuplas. solíaesta respuesta como base. Encontré que había un error en eso, a saber, no llamaroperator()
del objeto hash con un valor:
return left() ^ right();
Debiera ser:
return left(std::get<0>(e)) ^ right(???);
Los ??? serían los elementos restantes de la tupla para continuar la creación de instancias recursiva de la plantilla. Aquí está el código completo incluyendo la parte de terminación:
#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;
}
};
}