标签:stdhash c c11 templates variadic-templates
有些人可能已经注意到std :: hash不支持元组.因此,我添加了一个过载,该过载似乎比到目前为止看到的解决方案“更小”.有人有想法进一步削减此代码吗?请注意,这是编译器的杀手!!唯一可以编译的语言是“ Clang 3.2” … Intel Compiler 13.1没有得到专门化,并且一直在告诉“ C标准不支持哈希blabla”.而且我们不需要谈论原始的Microsoft编译器.
顺便说一句,我的解决方案支持递归元组,例如std :: tuple< std :: tuple< int,int>,int>.所以我不确定这是否也适用于我今天看到的现有解决方案.
namespace std
{
template<typename... TTypes>
class hash<std::tuple<TTypes...>>
{
private:
typedef std::tuple<TTypes...> Tuple;
template<int N>
size_t operator()(Tuple value) const { return 0; }
template<int N, typename THead, typename... TTail>
size_t operator()(Tuple value) const
{
constexpr int Index = N - sizeof...(TTail) - 1;
return hash<THead>()(std::get<Index>(value)) ^ operator()<N, TTail...>(value);
}
public:
size_t operator()(Tuple value) const
{
return operator()<sizeof...(TTypes), TTypes...>(value);
}
};
}
解决方法:
一看就很明显了:
template<int N, typename THead, typename... TTail>
size_t operator()(Tuple value) const
{
constexpr int Index = N - sizeof...(TTail) - 1;
return hash<THead>()(std::get<Index>(value)) ^ operator()<N, TTail...>(value);
}
标签:stdhash,c,c11,templates,variadic-templates 来源: https://codeday.me/bug/20191009/1878380.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。