سؤال

وأود أن أكتب فئة مجمع مع جميع المشغلين طاقتها بحيث يمكنني كشف عندما نكتب / قراءة أو تعديل محتوياته. على سبيل المثال:

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

وأي شخص بالفعل لم ذلك؟ إن لم يكن الذي المشغلين لا بد لي الزائد للتأكد من أنني لا يغيب عن أي شيء؟

هل كانت مفيدة؟

المحلول

وأنت لا تستطيع، على ما أعتقد. مشغل ؟: ليس overloadable. أيضا، إذا تم تعريف T::T(int)، T foo = 4 هو قانوني ولكن T foo = probe<int>(4) ليست كذلك. هناك تحويل المعرفة من قبل مستخدم واحد على الأكثر.

وعلاوة على ذلك، لأن التحقيق ليس POD، سلوك البرنامج يمكن أن تتغير.

نصائح أخرى

استخدم هذا كفكرة مشتركة. هناك الكثير من العوامل مثل و= |. = [] التي ربما ليست الرئيسية في قضيتك

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;
    }
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top