1

悪いタイトルで申し訳ありません...私は次のような基本クラスを持っています:

template<class T>
class GPtr
{
public:
    typedef T BaseType;

    GPtr& operator=(const BaseType& rhs)
    {
        ...
    }
};

私はよく、次のようなサブクラス化された特殊化を作成したいと考えています。

class GraphicPtr : public GPtr<Graphic>
{
...
};

ただし、基本クラスの代入演算子はまだ返されGPtr<Graphic>ませんGraphicPtr。コア代入演算子の機能が後で変更される場合に備えて、コードをコピーして貼り付ける必要があるのは面倒です。

基本クラスの代入演算子を定義して、使用中の実際のクラスの型を返す適切な方法はありますか?

4

3 に答える 3

1

C++ では、基底クラスはそれが子であるとは認識していません。派生クラスとなるテンプレート パラメータを追加して使用することができます。

template<class T, class Derived>
class GPtr
{
public:
    typedef T BaseType;

    Derived& operator=(const BaseType& rhs)
    {
        ...
    }
};
于 2013-04-25T09:09:01.900 に答える
1

代わりにCRTPを使用できますか?

#include <iostream>

template<class Derived>
class GPtr
{
public:
    typedef Derived DerivedType;

    GPtr& operator=(const GPtr& rhs)
    {
        std::cout << "GPtr::operator=" << std::endl;

        return *this;
    }
};

class GraphicDerived : public GPtr<GraphicDerived>
{
    public: 

        GraphicDerived& operator=(const GraphicDerived& rhs)
        {
            std::cout << "GraphicDerived::operator=" << std::endl;
            // Inheiriting shadows the name of the base operator= which 
            // needs to be explicitly called.
            GPtr<GraphicDerived>::operator=(rhs); 
            return *this;
        };
};

class Graphic {};

using namespace std;

int main()
{


    GraphicDerived one; 
    GraphicDerived two;

    cout << "derived assignment: " << endl;
    one = two;

    GPtr<Graphic> ptrOne;
    GPtr<Graphic> ptrTwo;

    cout << "GPtr assignment stnadalone : " << endl;

    ptrOne = ptrTwo; 
};

結果:

derived assignment: 
GraphicDerived::operator=
GPtr::operator=
GPtr assignment stnadalone : 
GPtr::operator=
于 2013-04-25T09:27:07.577 に答える
1

あなたが求めていることは本当に意味がありません。基本オブジェクトが割り当てられているとき、潜在的に無限の数の派生型のどれから呼び出されているかを知ることができないため、それぞれの場合に異なる型を返すことはできません。さらに、それができたとしても、それを実際のコードで使用することはできません。

C++ は、実行時にポリモーフィック呼び出し以外のすべてを解決します。ポリモーフィック呼び出しの場合でも、正確なオーバーライドの検索が遅れるだけで、署名は見つかりません (つまり、共変の戻り値の型であっても、基本オーバーライドの戻り値の型が使用されます。

技術的には、テンプレートの有無にかかわらず実行できますがそれらはすべて同じコアの問題を示します。基本クラスは、代入演算子によって返される型である単一の型の基本クラスにしかなれず、基本クラスとしての使いやすさが制限されます。 .

あなたが解決したい本当の問題は何ですか?

あなたが取っているアプローチは適切ではないようです。達成しようとしていることを説明して、人々が他のアプローチを提案できるようにすると、はるかに良いでしょう。

于 2013-04-25T11:57:10.323 に答える