【发布时间】:2012-05-16 21:16:46
【问题描述】:
给定一个
template<typename First, typename... Tail>
struct something
{
std::tuple<First, Tail...> t;
};
我怎样才能得到一个包含t 中除第一个元素之外的所有元素的std::tuple<Tail...>?
我认为总的来说这是一个有趣的问题,但这是我的上下文动机:
我想为元组实现哈希。我以this answer 为基础。我发现里面有一个错误,即没有用值调用hash对象的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;
}
};
}
【问题讨论】: