Учитывая
template<typename First, typename... Tail>
struct something
{
std::tuple<First, Tail...> t;
};
Как я могу получить std::tuple<Tail...>
, который содержит все элементы из t
, за исключением первого?
Я думаю, что это интересный вопрос в целом, но вот моя мотивация для контекста:
Я хотел бы реализовать хэш для кортежей. Я использовал этот ответ в качестве основы. Я обнаружил, что в нем была ошибка, а именно: не вызывал operator()
хэш-объекта со значением:
return left() ^ right();
Должно быть:
return left(std::get<0>(e)) ^ right(???);
??? были бы оставшимися элементами кортежа, чтобы продолжить рекурсивное создание шаблона. Вот полный код, включая конечную часть:
#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;
}
};
}