монитор с перегрузкой операторов c ++ - PullRequest
4 голосов
/ 03 марта 2009

Я хотел бы написать класс-оболочку со всеми перегруженными операторами, чтобы я мог определять, когда мы пишем / читаем или изменяем его содержимое. Например:

probe<int> x;
x = 5;     // write
if(x) {    // read
   x += 7; // modify
}

Кто-нибудь уже сделал это? Если нет, то каких операторов я должен перегружать, чтобы быть уверенным, что ничего не пропустил?

Ответы [ 2 ]

2 голосов
/ 03 марта 2009

Используйте это как общую идею. Существует множество операторов, таких как & = | = [], которые, возможно, не являются основными в вашем случае.

template < typename T >
struct monitor
{
    monitor( const T& data ):
        data_( data )
    {
        id_ = get_next_monitor_id(); 
    }

    monitor( const monitor& m )
    {
       id_ = get_next_monitor_id();

       m.notify_read();
       notify_write();

       data_ = m.data_;
    }

    operator T()
    {
        notify_read();
        return data_;    
    }

    monitor& operator = ( const monitor& m )
    {
        m.notify_read();
        notify_write();

        data_ = m.data_;
        return *this;
    }

    monitor& operator += ( const monitor& m )
    {
        m.notify_read();
        notify_write();

        data_ += m.data_;
        return *this;
    }
/*
    operator *=
    operator /=
    operator ++ ();
    operator ++ (int);
    operator -- ();
    operator -- (int);
*/
private:
    int id_;
    T data_;

    void notify_read()
    {
        std::cout << "object " << id_ << " was read" << std::endl;
    }

    void notify_write()
    {
        std::cout << "object " << id_ << " was written" << std::endl;
    }
};
1 голос
/ 03 марта 2009

Вы не можете, я думаю. оператор ?: не перегружен. Кроме того, если T::T(int) определено, T foo = 4 допустимо, а T foo = probe<int>(4) - нет. Существует не более одного пользовательского преобразования.

Кроме того, поскольку probe не является POD, поведение вашей программы может измениться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...