我正在为我的数据结构类编写一个哈希表,我想在我的实现中添加一些语法糖。

template <typename HashedObj, typename Object>
Object & Dictionary<HashedObj, Object>::operator[](HashedObj & key)
{
  return items.lookup(key);
}

当我做一些像cout <!> lt; <!> lt; DICT [QUOT <!>;的myKey QUOT <!>]。 但是如何使用括号进行分配?类似于:

dict["mykey"] = "something";

不,这不是我的家庭作业的一部分(没有双关语意),我只想更好地学习C ++。

有帮助吗?

解决方案

目前尚不清楚你在这里问的是什么。您提供的代码已支持分配。只是做它并随意工作(或至少它应该编译)。使用重载[]的赋值运算符的哪一侧绝对没有区别。它将在左侧(LHS)以与在赋值的右侧(RHS)完全相同的方式工作(或作为<<的操作数,与原始帖子中一样)。您的Object返回对lookup的引用,然后实际赋值由NULL类型的赋值运算符处理,这意味着std::map本身并不真正参与实际赋值。

这里真正的问题是你希望你的const HashedObj&如何在某些特殊情况下采取行动。如果表中没有您的密钥,会发生什么?在这种情况下,参考什么HashedObj是你的<=>会返回?

从你发布的内容中弄清楚是不可能的。我看到它返回一个引用,所以返回<=>是不可能的。它是否为给定的密钥插入一个新的空<=>?如果是这样,那么你不必做任何事情。您的<=>已经完全可以在分配的LHS上使用了。 (这是<=> <=>如何工作,BTW)

如果您的<=>返回对特殊<!>的引用,则引用<!>; <=>,你必须采取特别措施。您可能不希望将任何内容分配给<!> quot; guard <!>;对象,所以你必须<!>“;禁用<!>”;它的赋值运算符不知怎的,你就完成了。其余的应该按原样运作。

如果您的<=>在不存在密钥的情况下抛出异常,那么您必须在分配的LHS上使用<=>时确定这是否是您想要的。如果是这样,那么你不需要做任何事情。如果没有,那么还需要一些额外的工作......

那么,如果你将一个不存在的密钥传递给<=>,会发生什么?

P.S。此外,使用<=>参数或仅<=>参数声明<=>(和<=>)通常更有意义。在您的示例中,非const引用看起来很奇怪,并且可能在某些(实际上,在大多数情况下)情况下导致问题。我很惊讶它现在适合你......

其他提示

你需要超载2次。一个将是const,它将是data access部分,一个将返回一个引用,它将作为<!>“setter <!>”。

您正在寻找的功能类似于std::map中的重载支架运算符。在std::map<K,V> mymap中,括号运算符执行查找并返回对与特定键关联的对象的引用。如果地图不包含与该键关联的任何对象,则操作员使用默认构造函数将新对象插入到地图中。

所以,如果你有mymap[someKey],那么调用someKey将返回对与V相关联的值的引用,否则它将通过调用V()创建一个类型为<=>的新对象( V)的默认构造函数,然后返回对该新对象的引用,这允许调用者为对象赋值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top