2009-03-03 7 views
4

Je voudrais écrire une classe wrapper avec tous les opérateurs surchargés de telle sorte que je puisse détecter quand nous écrivons/lisons ou modifions son contenu. Par exemple:moniteur avec surcharge d'opérateur C++

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

Quelqu'un l'a déjà fait? Si non, quels opérateurs dois-je surcharger pour être sûr de ne rien manquer?

Répondre

1

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

En outre, parce que la sonde n'est pas un POD, le comportement de votre programme peut changer.

+0

T foo = sonde (4) est légal. –

+0

pouvez-vous fournir un exemple du problème que vous avez mentionné avec "?:" –

+0

@Mykoala: T foo = T (sonde (4)); serait légal. probe-> int-> T est deux conversions. Un prob avec?: Existe lorsque vous utilisez la sonde en tant que second argument et la sonde en tant que troisième. Pas de type commun. Avec l'opérateur + (sonde , sonde ) vous pouvez le réparer avec beaucoup de surcharges. – MSalters

2

Utilisez ceci comme une idée commune. Il ya beaucoup d'opérateurs comme & = | = [] qui ne sont peut-être pas principal 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; 
    } 
}; 
+0

Pourquoi pas aussi ++, -? – dirkgently

+0

++ et - postfix et préfixe (http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14) –

+0

Compris. Modifié. Merci. –