我可以获得调用静态方法的类吗?

时间:2013-03-26 04:40:12

标签: c++ polymorphism

这可能是不可能的,但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();
    }
};

有什么想法吗?

1 个答案:

答案 0 :(得分: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成员函数,而不是尝试让基类完成工作。