C# に似たプロパティ クラスを C++ で実装しています。したがって、内部フィールド (mother::_i) へのアクセスをプロパティ フィールド (mother::i) に提供する必要があります。
解決策はほとんど見つかりませんでしたが、完璧なものはありませんでした。
まず、RProperty<...>::SetOwner(mother&) のようなメソッドを呼び出して、実行時に所有者 (この場合は母) のポインターを提供するメソッドを作成しました。ただし、実行時にプロパティ クラスとコストを使用するには、追加のコードが必要です。
次に、RProperty のこのポインターとそれ自体のメンバー ポインターが所有者のポインターを見つけることができるという考えを思いつきました。明らかに、ownerpointer = this - &mother::i. しかし、メンバー自体へのメンバーポインターを提供すると、コンパイル時エラーが発生します。「空の」構造体を使用してプロパティへのメンバー ポインターを提供するトリッキーな方法を試しました。しかし、 sizeof(struct empty) がゼロではないことがわかりました。インスタンスごとに不要な余分なメモリが必要になります。私はこの問題に数日間立ち往生しました。
誰か良い考えがありますか?:)
コードは機能しますが、完全ではありません:
#include "stdafx.h"
struct empty{};
template<typename TCLASS, typename TFIELD>
class RPropertyBase
{
protected:
RPropertyBase(){ }
TCLASS& getOwner() const { };
};
template<typename TCLASS, typename TFIELD, TFIELD TCLASS::*PFIELD, empty TCLASS::*PTHIS>
class RProperty : RPropertyBase<TCLASS, TFIELD>
{
protected:
TCLASS& getOwner() const { return *(TCLASS*)((unsigned int)this-(unsigned int)&(((TCLASS*)0)->*PTHIS)-sizeof(empty) ); }
public:
RProperty<TCLASS, TFIELD, PFIELD, PTHIS>& operator=(const TFIELD& A){ getOwner().*PFIELD = A; return *this; }
operator TFIELD&() const { return getOwner().*PFIELD; }
};
class mother
{
int _i;
template<typename C>
struct __Propertyi : public RProperty<C, int, &C::_i, &C::_empty>
{
using RProperty<C, int, &C::_i, &C::_empty>::operator=;
};
public:
empty _empty;
__Propertyi<mother> i;
};
int _tmain(int argc, _TCHAR* argv[])
{
mother a;
a.i = 1;
int bb = (a.i);
return 0;
}