MFC:覆盖CMap<>对象的HashKey()的正确方法?



我试图覆盖MFC CMap类HashKey()函数。Programming Windows with MFC Second Edition的第290页给出了一个函数的示例,例如:UINT AFXAPI HashKey(CString & string)并说只使用特定类型。好吧,这只导致了错误,查找内容,现在似乎使用template<>. 我们如何覆盖这些? 例:

typedef uint32_t myint_t;
CMap<myint_t, myint_t&, uint32_t, uint32_t&> m_MyCMap;

我想覆盖myint_t但说它已经存在于afxtempl.h

如果我必须覆盖所有int类型,我怎么能做到这一点? 这是我使用的唯一CMap(我知道,除非内部MFC也在使用一些CMap,我认为这是很有可能的(。

那么,如何正确覆盖给定类型CMap<>HashKey()呢?

啪!!

HashKey 的文档包含所有信息。它是一个函数模板,您需要提供与ARG_KEY模板类型参数匹配的专用化(在您的情况下myint_t&(:

template <> UINT AFXAPI HashKey(myint_t& key)
{
// ...
}

标准C++规则适用。特别是,您最多只能为任何给定类型提供一个专业化。C++中的typedef声明类型别名;它不会引入新类型,并且无法为彼此别名的类型提供专用化。

MFC 中CMap的此扩展点是为自定义类型提供的。如果使用整型或基 MFC 类型作为键,则需要接受 MFC 提供的哈希函数。这本质上与您使用标准容器(如std::map(获得的行为相同。

相关内容

最新更新