我正在尝试为内部类编写哈希函数,该内部类是较大类的受保护成员。此外,哈希函数应使用内部类的受保护成员(在这种情况下为字符串)。所以这是没有哈希函数的样子:
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“)”
如何为受保护的内部类定义哈希函数(使用内部类的受保护成员)?
我认为这是您想要的:
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);
}
我还要问,为什么是protected
? protected
使项目可用于派生类。您可能已经简化了这些内容,但如果不是,则想使用private
。
[我认为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;
};