如何为自定义类型扩展std :: tr1 :: hash?

Ant*_*eru 22 c++ tr1

如何允许STL实现获取我的自定义类型?在MSVC上,有一个类std::tr1::hash,我可以通过使用来部分专门化

namespace std 
{
    namespace tr1 
    { 
        template <> 
        struct hash<MyType> 
        { ... };
    } 
}
Run Code Online (Sandbox Code Playgroud)

但这是推荐的方式吗?此外,这是否也适用于GCC的实施?因为boost::hash,它足以提供免费功能size_t hash_value (const MyType&),是否有类似的TR1实现?

phi*_*red 21

我试图找出使用无序关联容器(也使用GCC,正如OP所要求的)执行此操作的确切语法并点击此问题.

不幸的是,它没有达到我想要的细节水平.通过查看gcc标头如何实现标准哈希函数,我得到了它的工作.鉴于在网络上缺乏示例(至少在撰写本文时),我认为这将是发布我自己的示例(我可以确认与GCC合作)的好地方:


namespace std { namespace tr1
{
   template <>
   struct hash<MyType> : public unary_function<MyType, size_t>
   {
       size_t operator()(const MyType& v) const
       {
           return /* my hash algorithm */;
       }
   };
}}

Run Code Online (Sandbox Code Playgroud)

(注意这里两个命名空间 - 这只是我对折叠嵌套命名空间的约定)


sth*_*sth 4

是的,这也适用于 GCC。我在一个更大的项目中使用它并且它工作没有问题。您还可以为 TR1 容器提供自己的自定义哈希类,但指定 std::tr1::hash<> 是默认哈希类。将其专门用于自定义类型似乎是扩展标准哈希功能的自然方法。