C ++模板使用问题指针

时间:2016-04-30 11:32:33

标签: c++ templates

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一样,因为应该清楚列表中有指针。

1 个答案:

答案 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;
}