Оператор констант в скобках в пользовательском контейнере - PullRequest
2 голосов
/ 16 октября 2019

У меня есть собственный класс с двумя перегруженными скобками - сеттер и геттер. Как вы знаете, они примерно так выглядятизменения в моем контейнере. Это сложно, так как всегда вызывается только не const оператор, например,

container[i] = 3;  // Non const operator[] called
x = container[i];  // Again, non const operator[] called

В двух приведенных выше случаях мне нужно различать внутреннее поведение в контейнере. Так есть ли способ явно вызывать различные операторы в случаях, как указано выше. Я не хочу использовать const экземпляр контейнера и определять другие функции, такие как set и get, хотя я ищу более правильный шаблон проектирования.

Спасибо!

1 Ответ

8 голосов
/ 16 октября 2019

Один трюк - создать прокси-объект. Это позволяет вам перегрузить оператор присваивания и поместить туда логику отслеживания, а затем вы можете гарантировать, что любые записи будут перехвачены. Если у вас есть

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);
};

, и теперь вы будете вызывать код отслеживания, когда пользователь фактически пытается присвоить ссылку.

...