2

これはおそらく不可能ですが、C ++は以前に私を驚かせたので、ここに行きます。

私はこの基本クラスと3つのほぼ同一のサブクラスを持っています:

class MyBaseClass {
};

class MyClassX : public MyBaseClass {
public:
    static MyClassX *create() { return new MyClassX(); }
};

class MyClassY : public MyBaseClass {
public:
    static MyClassY *create() { return new MyClassY(); }
};

class MyClassZ : public MyBaseClass {
public:
    static MyClassZ *create() { return new MyClassZ(); }
};

そして私はそれらをこのように呼ぶことができます:

MyClassY *myObjectY = MyClassY::create();

そして、基本クラスが作業を実行できるようにそれを短縮したいと思います。すべてのサブクラスに対してそのcreate()定義を繰り返す必要はありません。

class MyBaseClass {
public:
    template<typename CalledForWhichClass>
    static CalledForWhichClass *create() {
        return new CalledForWhichClass();
    }
};

class MyClassX : public MyBaseClass { };

class MyClassY : public MyBaseClass { };

class MyClassZ : public MyBaseClass { };

ただし、この設定では、次のように呼び出す必要があります。

MyClassY myObjectY = MyBaseClass::create<MyClassY>();

しかし、私はそれを作りたいので、私は以前のようにそれらを呼び出すことができます:

MyClassY *myObjectY = MyClassY::create();

私はおそらくこのような黒魔術があることを望んでいました:

class MyBaseClass {
public:
    template<typename CalledForWhichClass = __static_context__>
    static CalledForWhichClass *create() {
        return new CalledForWhichClass();
    }
};

何か案は?

4

1 に答える 1

2

CRTPを使ってみませんか?

template <typename Derived>
struct BasicMyClass : MyBaseClass {
    static Derived *create() { return new Derived(); }
};

struct MyClassX : public BasicMyClass<MyClassX> {};
struct MyClassY : public BasicMyClass<MyClassY> {);
struct MyClassZ : public BasicMyClass<MyClassZ> {);

基本クラスに作業を行わせる代わりに、このテンプレートを使用して、createメンバー関数を自動的に作成します。

于 2013-03-26T04:55:26.543 に答える