2

私はこのようなクラスを持っています:

template<typename T>
class wrapper
{
public:
    operator const T & () const
    {
        return value;
    }
private:
    T value;
};

次に、次のような構造体で使用します。

struct point { float x; float y; };

//...

wrapper<point> myPoint;
std::cout << myPoint.x;// error: no member x or whatever.

((point)myPoint).x を実行せずにこれを許可する方法があるかどうか疑問に思っています。-> 演算子をオーバーロードできることはわかっていますが、非ポインターであると「ふりをする」ことになっているため、オーバーロードしないことをお勧めします。

4

2 に答える 2

3

の代わりにで同様のことを達成できます:->.

template<typename T>
class wrapper
{
public:
    operator const T & () const // will this still be needed now?
    {
        return value;
    }

    T* operator->() { return &value; }
    T const* operator->() const { return &value; }

private:
    T value;
};

その後:

struct point { float x; float y; }

//...

wrapper<point> myPoint; // this needs to be initialised!
std::cout << myPoint->x;
于 2012-08-03T16:26:59.563 に答える
2

説明したように、ラッパークラスを実際のクラスのふりをすることはできません。主な理由は、メンバー選択 (.) 演算子をオーバーロードできないためです。

于 2012-08-03T17:05:47.300 に答える