Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::hash<;uint64_t>;对于自定义类_C++_Stdhash - Fatal编程技术网

C++ 使用std::hash<;uint64_t>;对于自定义类

C++ 使用std::hash<;uint64_t>;对于自定义类,c++,stdhash,C++,Stdhash,以下两个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 nam

以下两个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_;
}
类非平凡类
{
公众:
大小\u t哈希()常量
{
//变体1
返回std::hash::_Do_hash(my_val);
//变体2希望避免创建命名对象
散列哈希器;
返回哈希器(my_val);
}
私人:
//用于散列的相关信息存储在此处
uint64\u t我的价值;
}
我直觉上想写一些像这样的东西

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

它没有编译(因为我没有初始化结构的实例?!)。有没有别的方法让我错过了?是否担心创建命名哈希结构是不必要的?

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

return std::hash<uint64_t>{}(my_val_);
返回std::hash{}(my_val);
它的作用与第二种方法相同

我不能确定
\u Do\u hash
做了什么,但无论如何它都是非标准的,不应该使用,以避免可移植性问题

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


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

返回std::hash{}(my_val)是我将要做的,我敦促您也这样做。:)<代码>\u Do\u hash
不是标准的,可能只在MSVC中有效<代码>std::hash很可能是一个空结构,创建它的对象一点也不麻烦。谢谢,就这样:)