c – 将类名插入容器中

我有几个派生自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]>();

我该怎么办?

最佳答案 类不是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;
}
点赞