プロパティのようなオブジェクトの実装について何度も議論されてきたことは知っていますが、私が必要としているのは、提案されているさまざまなソリューションとは少し異なります。
必要なのは、変数と同じセマンティクスを持つオブジェクトですが、その値が変更されたときに、何らかのアクションを実行したいと思います。これは、暗黙のget / setメソッドを持ち、演算子=と暗黙の変換演算子のオーバーロードを実装することを意味します。
私が「プロパティのような」を意味するとき、私は必ずしもセマンティックobject.property
を意味するのではなく、(のように)暗黙のget/setメソッドを持つ方法にすぎないことに注意してくださいproperty-like-variable = value
。その理由は、変数を使用する既存のコードがあり、既存のコードを変更せずに変数値が変更されるたびに何らかのアクションを実行したいためです(変数の宣言のみを変更する必要があります)。
私はこのような最小限のコードでこの結果を得ました:
#include <stdio.h>
class Int
{
int _value;
public:
// default constructor
Int() { printf("Int: initial value undefined\n"); }
// assignment constructor
Int(int value) : _value(value) { printf("Int: initial value is %d\n", _value); }
// property get
operator const int() const { return _value; }
// property set
int operator=(int value)
{
_value = value;
printf("new value is %d\n", value);
return value;
}
// TODO: overload other operators if needed
};
これは使用例です:
class C
{
Int _i;
public:
C() : _i(2) { }
void foo()
{
_i = 3;
printf("foo(): _i = %d\n", _i);
}
};
int main()
{
int i;
Int I;
i = 1;
I = i;
I = I + 1;
C c;
c.foo();
}
今いくつかの質問:
- この特定の必要性はすでに議論されていますか?デザインパターンはありますか?
- 私はここで何か悪いことをしていますか?(実装と設計の両方の観点から)
- これを行うことにはパフォーマンス面でいくつかの欠点がありますか、それともコンパイラーはオーバーヘッドなしでそれを最適化することができますか?
- この構成を呼び出すためのより良い方法はありますか?これは厳密には「プロパティ」ではないように思われるためです(これは、クラス内の変数を「ボックス化」することに似ているようです)。
- これはテンプレートで一般化できますか?値を取得/設定するときにカスタム処理を実行する必要があるため、簡単な方法はわかりません。