给定一个
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;
}
};
}