如何将运算符定义从头文件添加到现有结构?
How can I add operator definition to an existing struct from a header file?
我正在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(。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 无法添加多个键以映射将结构作为键
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 继承层次结构并将元素添加到向量
- 如何使用矢量元素将项目添加到结构中?
- 将结构时间规范添加到类(似乎没有其他类型的)会导致EXEC_BAD_ACCESS
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- 在C++中将类实例添加到对象层次结构中的问题
- 用于添加和查找查询的适当数据结构
- 如何在不添加对库的依赖的情况下添加与库结构的兼容性
- 将指向结构数组的指针添加到 std::map
- 如何将运算符定义从头文件添加到现有结构?
- 如何在类中添加结构,结构的向量以映射
- 尝试在文本文件中添加结构元素而不覆盖它
- 为什么我的向量没有添加结构
- 使用 enable_if 选择性地添加结构成员
- Clang重写器:为无效程序添加结构定义
- 向Std::vector添加结构体时使用Std::bad_alloc
- 动态地向容器中添加结构并检索它们