[英]Constness in brackets operator in custom container
我有一個自定義的 class 帶有兩個重載的括號運算符——setter 和 getter。 如你所知,它們看起來有點像這樣
class IntContainer {
public:
int const & operator[] (size_t i) const;
int & operator[] (size_t i);
}
我現在面臨的問題是,我必須檢查值的設置時間或剛剛訪問的時間,即我需要跟蹤容器中的所有更改。 這很難,因為總是只調用非常const
運算符,例如
container[i] = 3; // Non const operator[] called
x = container[i]; // Again, non const operator[] called
在上述兩種情況下,我需要區分容器中的內部行為。 那么在上述情況下,有什么方法可以顯式調用不同的運算符。 我不想使用容器的const
實例並定義其他函數,例如set
和get
,盡管我正在尋找正確的設計模式。
謝謝!
一個技巧是創建一個代理 object。 這使您可以重載賦值運算符並將跟蹤邏輯放入其中,然后您可以保證捕獲任何寫入。 如果你有
class Proxy
{
int& val;
Proxy(int& val) : val(val) {}
Proxy& operator=(int new_val)
{
// do tracking stuff
val = new_val;
}
operator int() { return val; }
};
那么您可以將IntContainer
調整為
class IntContainer {
public:
int operator[] (size_t i) const;
Proxy operator[] (size_t i);
};
現在您將在用戶實際嘗試分配給參考時調用跟蹤代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.