2012-01-05 104 views
4

我正在維護一個類似於std::map/std::unordered_map的接口的容器類。C++ const正確性與std :: pair

接口聲稱要存儲std::pair<const X,Y>(即這就是value_type是)。但是,在內部,實現存儲std::pair<X,Y>的排序數組。

當前實現使用reinterpret_cast來實現迭代器。我的問題是,有沒有更好的選擇?

移動到存儲std::pair<const X,Y>的數組是不可能的,因爲實現需要複製數組中的元素以實現插入和刪除操作。其中一種方法是使用std::sort


編輯:雖然我相信reinterpret_cast調用不確定的行爲我還沒有遇到一個編譯器在哪裏,這並不工作 - 我是否擔心什麼(定義或實施?)?


當前實現迭代器的非關聯化:

template <class K, class M> 
std::pair<const K,M>& operator*() { 
    std::pair<K,M>& result = ...; 
    return *reinterpret_cast<std::pair<const K,M>*)(&result); 
} 
+0

我還沒有嘗試過,但不會const_cast比reinterpret_cast更可取? – Benj 2012-01-05 17:44:15

+1

@Benj'const_cast'不能在這裏完成這項工作。 – 2012-01-05 17:46:19

+0

爲什麼你不能有內部常量?也許你可以改變分配到銷燬/重建? – 2012-01-05 17:48:49

回答

2

我相信你無法通過返回std::pair解決這個問題。相反,你將不得不返回一個代理對象看起來像標準對,但如果你更新second成員它傳播到主容器,而第一個成員公開爲const如你所願。

+0

有一個與OP類似的項目,這聽起來並不像聽起來那麼簡單。也許雖然。我會給它一個旋風。 – 2012-01-05 20:20:22

+0

http://stackoverflow.com/questions/3638541給出了返回一個'std :: pair (第一,第二)'完全不同的對象的想法,但用戶不應該知道。 – 2012-01-05 20:25:51

1

「更好的選擇?」 reinterpret_cast有什麼不對?在這種情況下,由於您使用兼容(實際上是相同的)表示形式在對象之間進行投射,所以演員陣容甚至可以很好地定義。