2015-11-11 84 views
3

我正在嘗試爲讀取和寫入操作重載'[]'操作符。我已經創造了他們這樣的:爲特定的讀寫操作重載下標操作符

V operator[] (K key) const; //Read 
V& operator[] (K key);  //Write 

但是,只有「寫」是從被稱爲以下兩個:

foo["test"] = "bar"; //Correct, will use 'write' 
cout << foo["test"]; //Incorrect, will use 'write' 

,這是什麼原因,是有可能的解決方案?

同樣的問題沒有幫助,在這裏找到:C++: Overloading the [ ] operator for read and write access

雖然,提出的解決方案並沒有如預期,並且仍然只寫超載被訪問工作。

+0

爲什麼沒另一個問題有幫助嗎?看起來對我完全一樣的問題。 –

+0

'const V&operator [](K key)const;'而不是'V operator [](K key)const;' – drescherjm

+0

這是同樣的問題,但沒有幫助,因爲只有寫入仍然被訪問 – Daniel

回答

3

重載是基於參數的靜態類型完成的。如果您使用的運算符foo爲非const,則使用非const過載。如果是const,則使用const過載。

如果你想讀,寫,你需要從中轉換爲合適類型的閱讀和對寫作合適的賦值運算符的標運算符返回一個代理來區分:

class X; 
class Proxy { 
    X* object; 
    Key key; 
public: 
    Proxy(X* object, Key key): object(object), key(key) {} 
    operator V() const { return object->read(key); } 
    void operator=(V const& v) { object->write(key, v); } 
}; 
class X { 
    // ... 
public: 
    V read(key) const; 
    void write(key, V const& v); 
    Proxy operator[](Key key)  { return Proxy(this, key); } 
    V  operator[](Key key) const { return this->read(key); } 
    // ... 
}; 
+0

[「介紹一箇中間代理可能會導致令人驚訝的編譯錯誤。」](https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Temporary_Proxy#Known_Uses)。此外,如果代理是從臨時對象構建而不是立即消耗,則可以有[UB](https://mpark.github.io/programming/2015/05/21/safer-proxy-idiom/)。 – zett42