我可以获取为其调用静态方法的类吗? [英] Can I get the class for which a static method was called?

查看:88
本文介绍了我可以获取为其调用静态方法的类吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这可能是不可能的,但是c ++之前让我感到惊讶,所以去了.

This is probably impossible, but c++ has surprised me before, so here goes.

我有这个基类和三个近似相同的子类:

I have this base class and three near-identical subclasses:

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()定义.

and I want to shorten that so the base class can do the work, and I don't have to repeat that create() definition for every subclass.

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

class MyClassX : public MyBaseClass { };

class MyClassY : public MyBaseClass { };

class MyClassZ : public MyBaseClass { };

但是,使用此设置,我现在必须将其命名为:

however, with this setup, I now have to call it like:

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

但是我想做到这一点,所以我仍然可以像以前那样称呼他们

but I want to make it so I can still call them like I used to:

MyClassY *myObjectY = MyClassY::create();

我希望也许会有这样的黑魔法:

I was hoping perhaps there was some black magic like this:

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成员函数,而不是试图让基类来工作.

Instead of trying to make the base class do the work, you use this template to automatically create the create member function for you.

这篇关于我可以获取为其调用静态方法的类吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆