Использование std :: ha sh для пользовательского класса - PullRequest
1 голос
/ 13 января 2020

Следующие два оператора возврата возвращают одно и то же?

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_);

, которое не компилировалось (потому что я не инициализировал экземпляр структуры ?!). Есть ли другой способ, которого я пропускаю? Бесполезно беспокоиться о создании именованной структуры хеша?

1 Ответ

1 голос
/ 13 января 2020

Более простой способ написать это - использовать временный объект:

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

Он делает то же самое, что и ваш второй подход.

Я не могу точно сказать, что _Do_hash делает, но в любом случае это нестандартное и не должно использоваться, чтобы избежать проблем с переносимостью.

Поскольку поиск в Google не обнаружил никакой документации по функции, я бы предположил, что это подробности реализации стандартной реализации библиотеки, которую вы используете и которая не предназначена для использования пользовательским кодом. Поэтому вам не следует использовать его вообще, даже если вас не волнует переносимость.

Также обратите внимание, что для производительности не имеет значения, используете ли вы свой подход с именованной переменной или мой подход, использующий временный характер. Компилятор почти наверняка сгенерирует из него идентичный код. Какой вы используете, это вопрос стиля кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...