dado un¿Cómo dividir una tupla?
template<typename First, typename... Tail>
struct something
{
std::tuple<First, Tail...> t;
};
¿Cómo puedo obtener una std::tuple<Tail...>
que contiene todos los elementos de t
a excepción de la primera?
creo que esto es una cuestión interesante en general, pero aquí es mi motivación para el contexto:
me gustaría aplicar un hash de tuplas. Usé this answer como base. Me di cuenta de que había un error en el mismo, es decir, no llamar operator()
del objeto hash con un valor:
return left()^right();
debe ser:
return left(std::get<0>(e))^right(???);
La ??? serían los elementos restantes de la tupla para continuar la instanciación recursiva de la plantilla. Aquí está el código completo que incluye 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;
}
};
}
Mi prueba: 'int main() {std :: tuple t1 (42, 'e', 16.7); std :: tuple t2 = cola (t1); std :: cout << std::get<0> (t2) << std :: endl; } 'falla al compilar:' error: no se puede llamar a la función miembro 'std :: tuple tail_impl , N ...> :: go (const std :: tuple &) [con T = int, Args = {char, double}, unsigned int ... N = {0u}] 'sin objeto' –
Disculpe, hubo algunos errores. Corregido ahora. –