在c++中,typeid用於返回指針或引用所指對象的實際類型。
基本介紹
- 中文名:typeid
- 作用:獲知一個變數的具體類型
- 注意:typeid是操作符
- 性質:g++中
C++的typeid,dede typeid,
C++的typeid
注意:typeid是操作符,不是函式!
運行時獲知變數類型名稱,可以使用 typeid(變數).name(),需要注意不是所有編譯器都輸出"int"、"float"等之類的名稱,對於這類的編譯器可以這樣使用:float f = 1.1f; if( typeid(f) == typeid(0.0f) ) ……
補充:對非引用類型,typeid是在編譯時期識別的,只有引用類型才會在運行時識別。
示例代碼:
#include <iostream>#include <typeinfo>using namespace std;int main(void){ // sample 1 cout << typeid(1.1f).name() << endl; // sample 2 class Base1 {}; class Derive1:public Base1 {}; Derive1 d1; Base1& b1 = d1; cout << typeid(b1).name() << endl; // 輸出"class Base1",因為Derive1和Base1之間沒有多態性 // sample 3, 編譯時需要加參數 /GR class Base2 { virtual void fun( void ) {} }; class Derive2:public Base2 { }; Derive2 d2; Base2& b2 = d2; cout << typeid(b2).name() << endl; // 輸出"class Derive2",因為Derive1和Base1之間有了多態性 // sample 4 class Derive22:public Base2 { }; // 指針強制轉化失敗後可以比較指針是否為零,而引用卻沒辦法,所以引用制轉化失敗後拋出異常 Derive2* pb1 = dynamic_cast<Derive2*>(&b2); cout << boolalpha << (0!=pb1) << endl; // 輸出"true",因為b2本身確實是指向Derive2 Derive22* pb2 = dynamic_cast<Derive22*>(&b2); cout << boolalpha << (0!=pb2) << endl; // 輸出"false",因為b2本身不是指向Derive22 try { Derive2& rb1 = dynamic_cast<Derive2&>(b2); cout << "true" << endl; }catch( bad_cast ) { cout << "false" << endl; } try{ Derive22& rb2 = dynamic_cast<Derive22&>(b2); cout << "true" << endl; } catch( ... ) // 應該是 bad_cast,但不知道為什麼在VC++6.0中卻不行?因為VC++6.0默認狀態是禁用 RTTI 的,啟用方式:project->setting->c/c++->category->c++ Language 下面第二個複選框選中。 { cout << "false" << endl; } return 0;}
dede typeid
織夢標籤內容
是指 typeid 的同級欄目
使用方式
{dede:arclist row=8 type='image.' titlelen='12' orderby=pubdate typeid='3' flag='h'}
{/dede:arclist}