すべての演算子がオーバーロードされたラッパークラスを作成して、その内容の書き込み/読み取りまたは変更を検出できるようにしたいと考えています。たとえば:オペレータのオーバーロードによるモニタC++
probe<int> x;
x = 5; // write
if(x) { // read
x += 7; // modify
}
誰でも既にこれを行いましたか?そうでない場合、私は何も見逃してはいけませ
すべての演算子がオーバーロードされたラッパークラスを作成して、その内容の書き込み/読み取りまたは変更を検出できるようにしたいと考えています。たとえば:オペレータのオーバーロードによるモニタC++
probe<int> x;
x = 5; // write
if(x) { // read
x += 7; // modify
}
誰でも既にこれを行いましたか?そうでない場合、私は何も見逃してはいけませ
私はそう思いません。 operator ?:は過負荷ではありません。また、T::T(int)
が定義されている場合、T foo = 4
は合法ですが、T foo = probe<int>(4)
ではありません。最大で1つのユーザー定義の変換があります。
さらに、プローブは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;
}
};
なぜ、++も - そうではありませんか? – dirkgently
++と - postfixとprefix(http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14) –
かわった。ありがとう。 –
T foo = probe(4)は合法です。 –
あなたは "?:"で述べた問題の例を教えてください。 –
@マイコラ:T foo = T(プローブ(4));合法であろう。 probe-> int-> Tは2回の変換です。 プローブは、を2番目の引数として使用し、プローブをを3番目の引数として使用すると存在します。一般的なタイプはありません。演算子+(プローブ、プローブ)を使用すると、多くの過負荷で修正できます。 –
MSalters