2011-09-01 83 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

相關問題