是否可以获得调用静态方法的类

Can I get the class for which a static method was called?

本文关键字:静态方法 调用 是否      更新时间:2023-10-16

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

任何想法?

如何使用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成员函数,而不是尝试让基类完成这项工作。