C++模板使用问题指针


template <typename T>
class Form { ... }
Form<MainWindow*> form;
T

将变为 T*

有没有办法以某种方式从T使用::staticMetaObject,现在是T*?我想保持这部分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 不起作用的原因。当然,我想让模板像那个表单一样,因为应该清楚列表中有指针。

您要查找的是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;
}