为复杂数据结构重载 [] C++ 运算符

Overload [] C++ operator for complex data-structure

我打算做什么:我有一个自己的容器结构。但它不应该存储所有元素,而只能存储一些具有特殊属性的元素,而其他元素可以根据结构中的信息动态创建。

因此我有一个 insert(ITEM* i) 方法,它检查 i 是否需要显式存储然后存储到地图中,或者它可以动态重建。然后只存储添加项目的信息。

ITEM* get(ITEMINDEX idx) 方法也是如此。它检查属于 idx 的 ITEM 是否被显式存储。如果是,则从内部映射中读取并返回指针。如果已注册但隐式存储,则会动态创建并返回 ITEM。

为了与代码中的其他结构兼容,我计划重载 [] 运算符,但我不知道如何处理这个问题,或者对于这个更复杂的结构是否可行。

这可能吗?如果可能,怎么做? 提前致谢!

更新 Nims 代码有效。但我现在意识到一个问题(虽然从一开始就很明显......):如果 get() 找到一个条目,则指针由 [] 返回。如果未存储,则构造 ITEM 并返回指针。但是RAM永远不会释放,因为使用容器的算法无法区分保存的构造项目删除第二种。

C++ class 运算符是一种名称奇怪的方法。它可以做任何你想做的事,只要它有一个预期的奇怪名字。在运算符 [] 的情况下,它看起来像

template <typename T>
T& operator[](std::size_t idx)       { /* arbitrary code */ };

这就是全部内容。

这个接口非常受限。您将获得一个索引并需要生成对 class 实例的引用作为响应。您可以 return 引用一些关于赋值有不同寻常想法的东西,例如在分配时,它对通过内部指针访问的数据结构进行一些检查。沿着这条路可能会有很多附带的复杂性。

如果您想为您的对象提供 operator[],如果以下代码有意义,您必须自己回答:

      MyObj obj;
/*1*/ obj[some_index] = new_object;
/*2*/ Obj& some_object = obj[some_index];

案例 1 的语义是什么 - 你说:它应该在你的 class 中插入一些值但是,你使用 insert(ITEM* i) 添加新数据(没有 some_index 此处提供),因此您应该禁止使用 class,就像 1.

一样

现在对于案例 2,在您的示例中您显示 ITEM* get(ITEMINDEX idx),因此您的 class 客户端代码必须知道什么是 ITEMINDEX,所以它看起来像案例 2 就可以了。

问题是 IMO 仅适用于情况 1,并使用 operator[] 插入新数据。如果您查看 std::map 容器,那么上述两种情况都没有问题。您 class 的用户将希望以与 std::map operator[] 类似的方式使用它,如果其功能不同,则会造成混淆。