簡體   English   中英

自定義容器中括號運算符中的常量

[英]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實例並定義其他函數,例如setget ,盡管我正在尋找正確的設計模式。

謝謝!

一個技巧是創建一個代理 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM