2009-03-03 10 views
4

すべての演算子がオーバーロードされたラッパークラスを作成して、その内容の書き込み/読み取りまたは変更を検出できるようにしたいと考えています。たとえば:オペレータのオーバーロードによるモニタC++

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

誰でも既にこれを行いましたか?そうでない場合、私は何も見逃してはいけませ

答えて

1

私はそう思いません。 operator ?:は過負荷ではありません。また、T::T(int)が定義されている場合、T foo = 4は合法ですが、T foo = probe<int>(4)ではありません。最大で1つのユーザー定義の変換があります。

さらに、プローブはPODではないため、プログラムの動作が変更される可能性があります。

+0

T foo = probe (4)は合法です。 –

+0

あなたは "?:"で述べた問題の例を教えてください。 –

+0

@マイコラ:T foo = T(プローブ(4));合法であろう。 probe-> int-> Tは2回の変換です。 プローブは、を2番目の引数として使用し、プローブをを3番目の引数として使用すると存在します。一般的なタイプはありません。演算子+(プローブ、プローブ)を使用すると、多くの過負荷で修正できます。 – MSalters

2

これは一般的な考え方として使用してください。 & = | = []のような演算子がたくさんありますが、あなたの場合はプリンシパルではないかもしれません。

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

なぜ、++も - そうではありませんか? – dirkgently

+0

++と - postfixとprefix(http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14) –

+0

かわった。ありがとう。 –

関連する問題