2011-11-29 103 views
4

所以我有一個智能迭代器模擬一個映射const_iterator,它需要在內部構建返回類型。顯然,我想在我的迭代器類中存儲一個pair<Key, Value>(因爲我需要修改它),但同時我希望取消引用函數提供pair<const Key, Value>(實際上它將分別爲const pair<const Key, Value>&const pair<const Key, Value>*) 。我到目前爲止提出的唯一解決方案是每次更改我的迭代器類指向的值更改時動態分配一對新對。不用說,這不是一個好的解決方案。是否可以將一對<Key, Value>轉換成一對<const Key,Value>?

我也試過*const_cast<const pair<const Key, Value> >(&value)其中value被宣佈爲pair<Key, Value>

任何幫助將不勝感激(如知識,它不能做)。

編輯

對於好奇:我結束了我的迭代器類存儲pair<const Key, Value> p。爲了改變對我改變分別基於底層迭代器(map<Key, Value>::const_iterator it),荷蘭國際集團const_cast關鍵的兩個要素,以便它可以改變,就像這樣:

*const_cast<Key*>(&p.first) = it->first; 
p.second = it->second; 

沒辦法了,我非常高興與,但它完成了工作,並且取消引用方法很開心,因爲我存儲了可以引用的正確類型的東西。

+3

您有問題嗎? –

+5

很難相信你會付出如此巨大的努力來發表這篇小文章,甚至不嘗試**:'std :: pair p(1,2); std :: pair q = p; //很好' –

+2

@ Kerrek SB:我認爲你忽略了Op的問題的一個重要部分。他希望避免每次調用自定義迭代器的解除引用/成員選擇操作符時構造一個新的對象。這在operator->中變得尤爲重要,因爲這意味着他的迭代器必須潛在地存儲成員對並在每次函數被調用或迭代器遞增/遞減時複製到成員對。 – stinky472

回答

6

可以pair<Key,Value>類型的轉換爲pair<const Key,Value>

然而,仔細閱讀問題,你實際上是在問,給予pair<Key,Value>你可以創建一個指針參考pair<const Key,Value>指的是同一個對象。

答案是否定的 - 唯一的情況是引用或指向一種類型的指針可以引用不同類型的對象,如果對象類型繼承自引用類型。

一種可能性是返回一對引用,pair<const Key&, Value&>,根據您希望引用的對創建。

+0

謝謝,我會看看如果參考配對解決方案能夠解決我的特殊問題(並且非常感謝您的仔細閱讀,我會在未來嘗試更加清楚地表達自己)。 – masaers

5

是的。

std::pair<int, double> p(1,2); 
std::pair<const int, double> q = p; // no problem 

//q.first = 8; // error 
q.second = 9; 

int b; double d; 
std::pair<int &, double &> s(b,d); 
std::pair<int const &, double &> t = s; // also fine 
+0

在我的特殊情況下,這會導致返回一個臨時對象的引用的情況,該對象無法編譯。 – masaers

+1

@MarkusSaers:給定你的'pair p',你可以返回一個'pair (p.first,p.second)',它不會創建任何臨時對象。 –

2

正如Kerrek SB所指出的那樣,您可以從std::pair<Key, Value>構建std::pair<const Key, Value>。但是,您的原始問題意味着您希望避免在每次迭代器被解除引用時構建std :: pair對象。

不幸的是,沒有一個好的方法來做到這一點。您可能必須構建pair對象並將其存儲在某處,特別是operator->。否則,您必須能夠讓您的地圖實際存儲pair<const Key, Value>以便能夠從您的迭代器中返回它的引用/指針。基本上返回一個引用/指針,它必須存儲在表單的某個地方:它不能是臨時的。

避免const_cast。這只是要求您在使用這種方式進行配對時未定義的行爲,儘管它可能經常使用。

0

我遇到了完全相同的問題。我的解決方案是創建一個新的地圖對象作爲迭代器類的一部分,然後添加到上游地圖類中錯過的成員並將引用返回給它的成員。效率不高,但有效。

您的解決方案有兩個問題:

  1. 分配一個const變量,const_cast會是不確定的行爲。編譯器優化可能會提供奇怪的結果。
  2. 任何新的解除引用都會使先前解除引用的結果無效。它不應該。所以,根據你的迭代器的用法,它也可能產生奇怪的結果。
+0

但是在我的情況下,沒有上游映射對象(這是一個自定義容器類,它不包含可以引用的std :: pair 元素 – masaers

+0

但是,您可以創建內部臨時std ::在每一個迭代器的解引用上以一種或另一種方式配對元素,並在迭代器實例銷燬時銷燬它們。 – Denis

相關問題