Как разбить кортеж?
Учитывая
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;
}
};
}