2

这可能是不可能的,但是 c++ 之前让我感到惊讶,所以就这样吧。

我有这个基类和三个几乎相同的子类:

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 回答