使用具有不同参数的相同操作符
Using same operator with different parameters
我正在考虑一个"map of maps"类型,并且想知道有两个operator[]
是否会被认为是不好的做法,不同的参数具有不同的含义。假设"外部"映射由OuterKeyType
索引,"内部"映射由InnerKeyType
索引,我们有一个"映射的映射"m
对象。然后,行为将是m[OuterKeyType]
将返回(对该键索引的整个内部映射的引用),而m[InnerKeyType]
将返回由对索引元素的所有映射的某些操作形成的复合(可以假设所有映射具有相同的键集)。
那么,这个设计是违反直觉的,还是不好的,或者它只是方便,因此是好的?
首先,通常通过传递的操作数在相同的函数名称下隐藏不同的行为是一个非常糟糕的主意。这使得很难确定遇到obj[value]
时会触发什么逻辑,因为它会有完全不同的行为,这取决于value
是什么,在阅读这段代码时可能是可见的,也可能是不可见的。
obj.getX(value)
和obj.getY(value)
更容易理解,前提是X
和Y
是合理的名称。
正如本教程所述,您不应该重载operator []
,而应该重载operator ()
。它比C中的"数组的数组"操作符更安全,更快,更像c++。
相关文章:
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- 单参数构造函数和赋值操作符
- c++中的操作符重载,无法调用双参数构造函数
- 操作符重载模板参数
- c++操作符重载以指针类型作为参数
- 在覆盖new操作符时传递更多参数(c++)
- 带有不同参数的c++操作符重载模板
- 重载操作符=,不同的类作为参数
- 如何检查类型是否存在无参数操作符()
- 传递静态方法作为参数,不需要地址操作符
- 检索对象的函数操作符的参数类型
- 带有派生类型参数的赋值操作符
- 使用具有不同参数的相同操作符
- 为什么小于操作符接受不同类型的参数,而std::min不接受
- 将构造函数参数转发给放置new操作符
- (为什么)移动构造函数或移动赋值操作符应该清除其参数
- 对操作符()()中具有状态和两个参数的函数对象使用boost绑定
- 比较测试失败:unorder_map上的[]操作符产生的参数数量错误
- 操作符重载和不同的模板参数
- c++如何确定重载操作符的参数