如何使用基类的 std::hash 对类型进行哈希处理?

cal*_*vin 1 c++ templates template-specialization stdhash

我有一个C<B>继承自 的类模板std::string,我想让它像普通的 一样可散列std::string。我编写了以下代码,并且可以编译。

我想知道这是否是正确的实现。由于从派生类到基类的转换可能会截断内存,我想知道它是否会花费太多?

#include <unordered_set>
#include <string>

template <bool B>
struct C : std::string
{
    C(std::string s) : std::string(s) {}
};

namespace std {

    template <bool B>
    struct hash<C<B>>
    {
        std::size_t operator()(const C<B> &k) const {
            return std::hash<std::string>()(static_cast<std::string>(k));
        }
    };

} // namespace std

int main() {
    std::unordered_set<C<false>> s;
    std::string c = C<false>("a");
    s.insert(c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ted*_*gmo 6

是的,该实现可以工作,但static_cast<std::string>(k)不是必需的 - 并且会创建一个std::string您可能希望避免的临时对象。

如果您改为创建它static_cast<const std::string&>(k),则不会创建临时的std::string。如果你简单地做同样的事情:

std::size_t operator()(const C<B>& k) const {
    return std::hash<std::string>()(k);
}
Run Code Online (Sandbox Code Playgroud)