2011-09-01 89 views
0

我正在考虑一张“地图图”类型,并想知道是否会有两个不同参数具有不同含义的错误练习。假设“外部”地图由OuterKeyType索引,内部地图索引为InnerKeyType,我们有一个“地图映射”m的对象。那么行为将是m[OuterKeyType]将返回(引用)由该键索引的整个内部映射,而m[InnerKeyType]将返回由索引的元素上的所有映射上的一些操作形成的化合物(可以假设所有映射都具有同一组键)。使用具有不同参数的相同算子

那么,这个设计是否违反直觉和坏,还是只是方便,因此好?

+0

如果我正确地理解了这一点,您已经有效地获得了一个值为矩阵的值,其中InnerKey是行索引,OuterKey是列索引(反之亦然),并且您想要获取行的列一个给定的索引? – Skizz

+0

嗯,是的,有点。以前没有这样想过,就像 – carlpett

+0

字面上只是地图的地图有什么问题? –

回答

2

第一件事是,一般来说,通过正在传递的操作数隐藏相同函数名下的不同行为是一个非常糟糕的主意。当你遇到obj[value]时,它很难确定将触发什么逻辑,因为它将具有完全不同的行为,具体取决于value是什么,在阅读此代码时可能不可见或不可见。

我会建议您为操作提供命名为功能,只是因为你可以重载运营商,这并不意味着你应该。根据不同的域名,功能可能会有不同的名称:obj.getX(value)obj.getY(value)要容易理解,前提是XY是合理的名称。

0

由于此tutorial指出,您不应该超载operator []而是operator()。它比C“array of array”运算符更安全,更快速,并且C++ ish。

+1

更多*性能*? –

+0

http://weblogs.asp.net/jgalloway/archive/2007/05/10/performant-isn-t-a-word.aspx。另外,我不会说改变我的重载操作符会改变我的代码的底层质量,安全性或性能。 – carlpett

+0

@carlpet:对不起,我和德国人混在一起了。我甚至在4小时前编辑了我的帖子,也没有链接。给你的评论:我发布的文章详细解释了为什么“'operator [] []'”不像一个简单的'operator()'那样快速/类型安全的原因。它*确实*有所作为,因为'operator [] []'在C++中不受支持,并且必须使用代理或嵌套映射类型来模拟。 – Constantinius

相关问题