使用 std::hash<uint64_t> 自定义 class

Using std::hash<uint64_t> for custom class

下面两个return语句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_);

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

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

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

它与第二种方法的作用相同。

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

由于 google 搜索没有找到该函数的任何文档,我假设它是您正在使用的标准库实现的一个实现细节,这并不意味着由用户代码使用。因此,即使您不关心可移植性,也根本不应该使用它。

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