这可能是不可能的,但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();
}
};
有什么想法吗?
答案 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
成员函数,而不是尝试让基类完成工作。