我正在考虑一个“地图地图”类型,并想知道有两个operator[]
s被认为是不好的做法,不同的参数具有不同的含义。假设“外部”地图由OuterKeyType
索引,内部地图由InnerKeyType
索引,我们有一个“地图地图”m
的对象。然后行为将是m[OuterKeyType]
将返回(引用)由该键索引的整个内部映射,而m[InnerKeyType]
将返回由索引元素上的所有映射上的某些操作形成的复合(可以假设所有地图都有相同的密钥集。)
那么,这个设计是违反直觉还是不好,还是只是方便而且好呢?
答案 0 :(得分:2)
首先,一般来说,通过正在传递的操作数隐藏同一函数名下的不同行为是一个非常糟糕的主意。当您遇到obj[value]
时,很难确定将触发什么逻辑,因为它会有完全不同的行为,具体取决于value
是什么,在阅读此代码时可能会或不可见。
我建议您为操作提供命名的函数,因为您可以重载运算符并不意味着应该。根据域,函数将具有不同的名称:obj.getX(value)
和obj.getY(value)
更容易理解,前提是X
和Y
是合理的名称。
答案 1 :(得分:0)
正如此tutorial所述,您不应重载operator []
,而应重载operator ()
。它比C“数组”数组“运算符更安全,更快,更C ++。