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