2012-12-06 33 views
3

具有類型 -獲取其中一個模板類包括

C_Type.h

#ifndef C_TYPE_H 
#define C_TYPE_H 
template <class T> 
class C_Type { 
    public: 
     T m_val; 
      // implementation ... 

}; 

#endif 

和程序 -

#include <iostream> 
#include <typeinfo> 
#include "C_Type.h" 
using namespace std ; 


int main() { 
    C_Type<int> a ; 
    cout <<typeid(a.m_val).name()<<endl; 

} 

我試圖提取intC_Type<int>由的,上面的程序只是給出了輸出 - i

編輯:

是否有可能沒有關於類成員(即m_val)獲得的類型(即int或我)?

回答

5

typeid::name返回的名稱是編譯器特定的,對於某些編譯器來說它是可怕的(如i對於int)。大多數編譯器支持對名稱進行重新定義,從而導致更好的表示,但對於程序使用仍然沒有用處。

這裏是demangling API來共同編譯器的列表:

+0

謝謝,我又添加了一個相關的問題..你的幫助將受到歡迎 – URL87

+0

它通常不是可怕的東西。大多數編譯器試圖做一些有用的事情。 g ++似乎是唯一的例外。 –

+0

@JamesKanze是的,我認爲我是誇張的。我讓這個句子有點溫和。 – pmr

1

「i」 是正確的名稱可能是類型爲 「INT」 的? 這只是一個名字!你想用這個名字做什麼?

int main() { 
    C_Type<int> a ; 
    int test=0; 
    if(typeid(a.m_val) == typeid(test)) 
     cout <<"Int"<<endl; 
} 
3

在回答你的最後一個問題(關於獲取類型 無需引用成員):無。在標準庫中, 有一個約定來提供typedef的實例類型以及從它派生的類型;通常名稱 是value_type,但也有例外(例如std::map)。如果 要堅持這個慣例(這是不是一個壞主意), 你應該添加:

typedef T value_type; 

到您的類(如公共成員),並參照它,當你 希望類型,而不是某些任意成員(可能或可能不存在)。

0

如果您需要檢索從模板規範模板參數(你有C++ 11),你可以這樣做:

template <template <typename> class Templ, typename T> 
T typeGetter(Templ<T>); 

然後,在你主:

int main() { 
    C_Type<int> a; 
    decltype(typeGetter(a)) i = 7; //declares i to be int 
}