2015-02-13 3 views
4

У меня есть несколько классов, которые являются производными от 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

Классы не являются первоклассными объектами в C++ (т. Е. Они не являются данными, которые могут передаваться или храниться в контейнерах). Есть что-то, что rensembles класса «имя», но на самом деле вы не гарантируете, что это читаемое имя, и вы не можете создать экземпляр с именем.

Что вы можете сделать вместо этого сделать карту от 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; 
} 
+0

Я попытался скомпилировать ваш ответ. Компилятор дает мне ошибку: ** нет совпадений, которые преобразуют функцию «create», чтобы ввести «класс QWidget * (*)()» в creators [1] = & create ; ** – lnk

+0

@lnk: код, показанный выше, компилируется и отлично работает , Одна из проблем, с которыми я столкнулась, - это то, что имя 'create' проблематично, когда внутри виджета, потому что это имя уже определено Qt. Использование префикса '::' решило эту проблему. – 6502

0

Шаблон подход не будет работать, если тип виджета не известен во время компиляции. Если вы хотите, чтобы заставить его работать, зная, какой виджет вы хотите во время выполнения, вы можете иметь функцию, которая создает правильный тип виджета, учитывая строку:

QWidget* Create(const string& widgetType) 

Теперь, чтобы сделать эту работу вам нужно механизм автоматического сопоставления классов (полученных из QWidget в вашем случае) с строками. This thread должен быть полезен в том, как это сделать.

Смежные вопросы