2

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;
}
4

1 に答える 1