如何将运算符定义从头文件添加到现有结构?

How can I add operator definition to an existing struct from a header file?

本文关键字:添加 结构 文件 运算符 定义      更新时间:2023-10-16

我正在Windows中开发一个SNMP Agent。在头文件snmp.h中有一个struct,它定义了值的OID标识符,其定义如下:

typedef struct {
UINT   idLength;
UINT * ids;
} AsnObjectIdentifier; 

我想将此AsnObjectIdentifier用作unordered_map的键,但struct定义不会重载==运算符,这让我想到了一个问题,是否可以将运算符重载添加到已经定义的struct中,或者我只需要让我的自定义struct包装AsnObjectIdentifier变量。

是的,您可以在类之外定义运算符:

bool operator==(AsnObjectIdentifier const& lhs, AsnObjectIdentifier const& rhs)
{
return /* whatever */;
}

或者,您可以定义一个自定义相等函数对象并将其传递给unordered_map的第四个模板参数。

您可以在unordered_map声明中简单地使用自定义函子。

实际上,unordered_map为此提供了自定义模板参数。

注意:您还需要提供一个函子来计算unordered_map哈希值。

template<
class Key,
class T,
class Hash = std::hash<Key>,   // <----- You need hash for Key
class KeyEqual = std::equal_to<Key>, // <---- Equal Functor
// ...

只需根据程序的逻辑定义函子即可。像这样:

struct AsnObjectIdentifierHasher {
std::size_t operator()(const AsnObjectIdentifier&) const noexcept;
};
struct AsnObjectIdentifierComparator {
bool operator()(const AsnObjectIdentifier&, 
const AsnObjectIdentifier&) const noexcept;
};
template <typename T>
using HashMap = std::unordered_map<AsnObjectIdentifier, 
T, 
AsnObjectIdentifierHasher, 
AsnObjectIdentifierComparator>;

我强烈建议不要使用自由函数来实现算术和逻辑运算符(特别是当 STL 接口通过模板参数提供自定义时(。函子(函数对象(提供更好的隔离代码并避免作用域问题(例如 ADL(。