使用具有不同参数的相同操作符

Using same operator with different parameters

本文关键字:参数 操作符      更新时间:2023-10-16

我正在考虑一个"map of maps"类型,并且想知道有两个operator[]是否会被认为是不好的做法,不同的参数具有不同的含义。假设"外部"映射由OuterKeyType索引,"内部"映射由InnerKeyType索引,我们有一个"映射的映射"m对象。然后,行为将是m[OuterKeyType]将返回(对该键索引的整个内部映射的引用),而m[InnerKeyType]将返回由对索引元素的所有映射的某些操作形成的复合(可以假设所有映射具有相同的键集)。

那么,这个设计是违反直觉的,还是不好的,或者它只是方便,因此是好的?

首先,通常通过传递的操作数在相同的函数名称下隐藏不同的行为是一个非常糟糕的主意。这使得很难确定遇到obj[value]时会触发什么逻辑,因为它会有完全不同的行为,这取决于value是什么,在阅读这段代码时可能是可见的,也可能是不可见的。

我建议您为操作提供命名的函数,仅仅因为您可以重载操作符并不意味着您应该。根据不同的域,函数将有不同的名称:obj.getX(value)obj.getY(value)更容易理解,前提是XY是合理的名称。

正如本教程所述,您不应该重载operator [],而应该重载operator ()。它比C中的"数组的数组"操作符更安全,更快,更像c++。