将类名插入容器中

时间:2015-02-13 17:40:52

标签: c++ qt templates

我有几个派生自QWidget的课程 我也有像这样的模板功能

    template<typename T>
    QWidget* create(){return static_cast<QWidget*>(new T());}

现在我想创建容器:

    QMap<int, className> classes // it is not compiling 

所以,我可以使用容器值作为函数模板类型:

    QWidget* widget = create<classes[i]>();

我该怎么做?

2 个答案:

答案 0 :(得分:2)

类不是C ++中的第一类对象(即它们不是可以传递或存储在容器中的数据)。有一些东西可以重命名“class”这个类,但实际上你并不能保证它是一个可读的名字而且无论如何你也无法创建一个给出名字的实例。

您可以做的是制作从int函数指针的地图,因为它们是第一类对象:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "derivedwidget.h"
#include <QMap>

template<typename T>
QWidget *create() { return new T; }

QMap<int, QWidget *(*)()> wmap;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    wmap[1] = &::create<DerivedWidget>;

    this->setCentralWidget(wmap[1]());
}

MainWindow::~MainWindow()
{
    delete ui;
}

答案 1 :(得分:0)

除非在编译时知道窗口小部件的类型,否则模板方法不会起作用。如果你想让它工作,知道在运行时你想要什么样的小部件,你可以有一个函数,在给定一个字符串的情况下创建正确类型的小部件:

QWidget* Create(const string& widgetType)

现在,为了完成这项工作,您需要一种机制来自动将类(从您的案例中的QWidget派生)映射到字符串。 This thread应该对如何执行此操作有所帮助。