Как хэшировать std::string_view?

Я пытаюсь определить свою собственную функцию хеширования для std::unordered_map и я хочу хешировать поле в структуре, которая должна быть ключом. Код ниже является упрощенной версией того, что у меня есть:

struct TestStruct {
    char a[64];
    char b[64];
}

struct my_eq {
    bool operator()(const TestStruct& test_1, const TestStruct& test_2) const {
        return !strcmp(test_1.a, test_2.a) && !strcmp(test_1.b, test_2.b);
    }
};

struct my_hash {
    unsigned long operator()(const TestStruct& test) const {
        return std::hash<std::string_view>(std::string_view(test.a));
    }
};
std::unordered_map<TestStruct, int, my_hash,my_eq> map;

Я получаю ошибку:

no matching function for call to ‘std::hash<std::basic_string_view<char> >::hash(std::string_view&)

Согласно cppreference наstd::hash хеш-функция должна поддерживать std::string_view, Я чувствую, что упускаю что-то простое, но не могу понять это.

2 ответа

Решение

Вы используете std::hash неправильно. std::hash это класс, который обеспечивает operator() это хеширует объект. Вы пытаетесь передать объект его конструктору, который не работает, так как у него есть только condtructor по умолчанию. Ваш operator() также должен быть отмечен const, Мы соединяем все это вместе и получаем:

struct my_hash {
    unsigned long operator()(const TestStruct& test) const {
        return std::hash<std::string_view>()(std::string_view(test.a));
    }
};

std::hash это шаблон класса, а не шаблон функции. вам нужен экземпляр для его вызова:

return std::hash<std::string_view>()(std::string_view(test.a));
Другие вопросы по тегам