首页 > 解决方案 > 使用 std::hash对于自定义类

问题描述

以下两个 return 语句返回相同的东西吗?

class NonTrivialClass
{
     public:
        size_t hash() const
        {
            // variation 1
            return std::hash<uint64_t>::_Do_hash(my_val_);

            // variation 2, wanted to avoid creating the named object
            std::hash<uint64_t> hasher;
            return hasher(my_val_);
        }
     private:
        // relevant info for hashing purposes is stored here
        uint64_t my_val_;
}

我凭直觉想写类似的东西

return std::hash<uint_64>(my_val_);

哪个没有编译(因为我没有初始化结构的实例?!)。还有另一种我想念的方式吗?是否担心不必要地创建命名的哈希结构?

标签: c++stdhash

解决方案


一种更简单的编写方法是使用临时对象:

return std::hash<uint64_t>{}(my_val_);

它与您的第二种方法做同样的事情。

我不能确定是什么_Do_hash,但无论如何它是非标准的,不应该使用,以避免可移植性问题。

由于谷歌搜索没有找到该函数的任何文档,我认为它是您正在使用的标准库实现的实现细节,并且不打算由用户代码使用。因此,即使您不关心可移植性,也不应该使用它。

另请注意,无论您是使用命名变量的方法还是使用临时变量的方法,性能都无关紧要。编译器几乎肯定会从中生成相同的代码。您使用的纯粹是代码风格的问题。


推荐阅读