Question

Je voudrais écrire une classe wrapper avec tous les opérateurs surchargés de manière à pouvoir détecter lorsque nous écrivons / lisons ou modifions son contenu. Par exemple:

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

Quelqu'un a déjà fait ça? Sinon, quels opérateurs dois-je surcharger pour être sûr de ne rien rater?

Était-ce utile?

La solution

Vous ne pouvez pas, je pense. opérateur ?: n'est pas surchargeable. De même, si T::T(int) est défini, T foo = 4 est légal mais T foo = probe<int>(4) ne l’est pas. Il existe au plus une conversion définie par l'utilisateur.

De plus, comme la sonde n'est pas un POD, le comportement de votre programme peut changer.

Autres conseils

Utilisez ceci comme une idée commune. Il existe de nombreux opérateurs comme & Amp; = | = [] qui ne sont peut-être pas principaux dans votre cas.

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;
    }
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top