在我的項目中,有這樣一個需求:在socket(TCP協議)通信部分,需要根據不同的業務協議類型分別設置一個不同的block時間。而此時我已經拿到了指向該協議(數據)對象的(父類型)指針。那最簡單的區分不同協議的方式就是使用c++的 typeid操作符。
typeid操作符的作用就是獲取一個表達式的類型。返回結果是const type_info&。不同編譯器實現的type_info class各不相同。但c++標准保證它會實現一個name()方法,該方法返回類型名字的c-style字符串。
如果typeid的操作數不是類類型或者是沒有虛函數的類,則typeid指出該操作數的靜態類型。如果操作數是定義了至少一個虛函數的類類型,則在運行時計算類型。
// expre_typeid_Operator.cpp // compile with: /GR /EHsc #include <iostream> #include <typeinfo.h> class Base { public: virtual void vvfunc() {} }; class Derived : public Base {}; using namespace std; int main() { Derived* pd = new Derived; Base* pb = pd; cout << typeid( pb ).name() << endl; // prints "class Base *" cout << typeid( *pb ).name() << endl; // prints "class Derived" cout << typeid( pd ).name() << endl; // prints "class Derived *" cout << typeid( *pd ).name() << endl; // prints "class Derived" delete pd; }
c++ RTTI還包括另外一個操作符dynamic_cast。有時間的時候,將c++ RTTI的知識整體梳理一下。