用CRTP实例化和注册派生类的最佳方法?

问题描述

我是一名业余程序员,试图学习一些新的C ++习惯用法(通过游戏开发,但这只是动机)。以前,如果我要制作像具有某些派生类的简单GUI系统那样的东西,我会做类似的事情:

- class Widget
- class Button : public Widget
- class AdvancedButton : public Button
- etc

我可能会使用中央GUI类来创建和管理这些小部件:

class GUI
{ 
public:
    template <class T> 
    Widget* createWidget() {
        auto new_widget = new T();
        return new_widget;
    }
}

这只是一个简单的例子来说明我的观点。当然,我会使用智能指针,并且通常将指向新创建对象的指针存储在地图或列表中。要实例化我的小部件,我要做

auto new_button = gui->createWidget<Button>(),它将自动创建并注册按钮。

当我尝试实现函数链接时,发现了CRTP,并意识到它不适用于标准继承。

现在,我有了标准继承,而不是:

struct BaseWidget {
    virtual ~BaseWidget() {}
};

template <typename Derived>
class Widget : BaseWidget { }

和我的子类如下:

template <typename Derived>
class Label : public Widget<Label<Derived>> {
    virtual Label& setter(int i)   { m_i= i; return static_cast<Derived>(*this); }
}

我的挑战是,这似乎排除了我通过中央管理器类实例化窗口小部件的原始模板化方式。使用CRTP时最好的选择是什么?

我希望这是有道理的。这是我第一次在这里提问,因此,如果我对基本问题有误解,请告诉我,这绝对是这种模式的新手。预先感谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...