C ++:为嵌套内部受保护的类定义哈希函数

问题描述 投票:0回答:2

我正在尝试为内部类编写哈希函数,该内部类是较大类的受保护成员。此外,哈希函数应使用内部类的受保护成员(在这种情况下为字符串)。所以这是没有哈希函数的样子:

class MasterClass
{
    public:
    // Blah blah blah
    protected:

        class InternalClass
        {
            public:
            // Blah blah blah 2
            protected:
                string m_Value;
        };

        unordered_map<InternalClass, uint> m_Example_Map;
};

因为我在MasterClass的unordered_map中使用InternalClass作为键,所以我需要定义哈希函数。

我正在使用以下参考:

但是我在头上。我最好的猜测是这样的:

class MasterClass::InternalClass;
namespace std
{
    template<> struct hash<MasterClass::InternalClass>
    {
    public:
        size_t operator()(const MasterClass::InternalClass& i_Internal) const;
    };
}

class MasterClass
{
    public:
    // Blah blah blah
    protected:

        class InternalClass
        {
            public:
            // Blah blah blah 2
            protected:
                string m_Value;
        };

        unordered_map<InternalClass, uint> m_Example_Map;

        friend struct std::hash<MasterClass::InternalClass>::operator()(const MasterClass::InternalClass& i_Name) const;
};

namespace std
{
    template<> size_t hash<MasterClass::InternalClass>::operator()(const MasterClass::InternalClass& i_Internal) const
    {
        return(std::hash<std::string>{}(*i_Internal.m_Value);
    }
}

但是,这首先会引起编译器错误,包括“无效的朋友声明”和“类std :: hash”的显式专门化(在“ C:\ Program Files(x86)\ Microsoft的第719行之前Visual Studio \ 2017 \ Enterprise \ VC \ Tools \ MSVC \ 14.16.27023 \ include \ type_traits“)”

如何为受保护的内部类定义哈希函数(使用内部类的受保护成员)?

c++ oop hash unordered-map protected
2个回答
0
投票

我认为这是您想要的:

class MasterClass
{
public:
    // Blah blah blah
protected:

    class InternalClass; // Forward declaration needed for friend declaration

    class MyHash
    {
    public:
        size_t operator()(const MasterClass::InternalClass& i_Internal) const;
    };

    class InternalClass
    {
    public:
        // Blah blah blah 2
    protected:
        std::string m_Value;

        friend size_t MasterClass::MyHash::operator()(const MasterClass::InternalClass& i_Internal) const; // firend to allow access to m_value
    };

    std::unordered_map<InternalClass, unsigned> m_Example_Map;
};

// Implementation of hash
size_t MasterClass::MyHash::operator()(const MasterClass::InternalClass& i_Internal) const
{
    return std::hash<std::string>{}(i_Internal.m_Value);
}

我还要问,为什么是protectedprotected使项目可用于派生类。您可能已经简化了这些内容,但如果不是,则想使用private


0
投票

[我认为std::hash没有实现此目的的任何方法,因为在定义std::hash之前,您需要先定义MasterClass的特殊化(因为它必须在名称空间范围内,并且因为m_Example_Map的类型需要它),并且在定义专门化之前,您需要定义MasterClass,因为它需要内部类类型。

但是std::unordered_map不需要使用std::hash。您可以提供自己的哈希函数:

class MasterClass
{
    public:
    // Blah blah blah
    protected:

        class InternalClass
        {
            public:
                // Blah blah blah 2
                struct hash {
                    auto operator()(const InternalClass& v) const {
                        return std::hash<std::string>{}(v.m_Value);
                    }
                };
                bool operator==(const InternalClass& other) const {
                    return m_Value == other.m_Value;
                }
            protected:
                string m_Value;
        };

        unordered_map<InternalClass, uint, InternalClass::hash> m_Example_Map;
};
© www.soinside.com 2019 - 2024. All rights reserved.