2016-04-30 74 views
-5
template <typename T> 
class Form { ... } 

Form<MainWindow*> form; 

T將成爲T *C++模板使用的問題指針

有沒有辦法使用:: staticMetaObject莫名其妙地在T現在這就是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不起作用。當然,我想讓模板就像那個Form一樣,因此應該清楚的是列表中有指針。

+0

http://stackoverflow.com/help/how-to-ask –

+0

我做編輯,我的問題 – Invader

+0

@Invader你爲什麼不首先在Form類中使用'T *',並簡單地寫'form = new表(this);'? –

回答

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; 
} 
+0

謝謝你remove_pointer的作品 – Invader