template <typename T>
class Form { ... }
Form<MainWindow*> form;
T将成为T *
有没有办法从T那个T *现在以某种方式使用:: staticMetaObject?我希望保留这部分Form<MainWindow*> form;
,就像它
感谢您帮助我
修改
在评论中我想提供一些代码。
class FormBase : public QObject
{
Q_OBJECT
public:
FormBase() {}
};
template <typename T>
class Form : public FormBase, public QList<T>
{
public:
Form(T a)
{
QList<T>::append(a);
}
T operator<<(const T t)
{
QList<T>::append(t);
qDebug() << T::staticMetaObject.className();
}
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
form = new Form<MainWindow*>(this);
*form << this;
}
指出T变为T *,这就是T :: staticMetaObject无效的原因。当然我想让像它这样的模板就像那个Form一样,因为应该清楚列表中有指针。
答案 0 :(得分:1)
您正在寻找的是std::remove_pointer
模板:
#include <type_traits>
#include <iostream>
template<typename T> class Form {
public:
int give_me_staticMetaObject()
{
typedef typename std::remove_pointer<T>::type obj_type;
return obj_type::staticMetaObject;
}
};
class Foo {
public:
static int staticMetaObject;
};
int Foo::staticMetaObject=5;
int main()
{
Form<Foo *> f;
std::cout << f.give_me_staticMetaObject() << std::endl;
}