2010年6月11日金曜日

typeid演算子

Check
C++のお話。

Colladaを読んでいて、daeElement型で取得したポインタを実際の型にダウンキャストしなければならない事態に陥った。陥ったというか設計上やむなしといったところか。いずれにせよ、そういう事態になった。

Colladaでも型情報を文字列で返してくれるなど、親切なAPIは用意されていたのだが、せっかくなのでtypeidを使ってみることにした。



#include <iostream>
#include <typeinfo>
using namespace std;

class Base
{
public:
   virtual ~Base(){}//仮想関数を作っておかないと実行時型情報が作られないっぽい
};
class Sub1: public Base{};
class Sub2: public Base{};

int main()
{
   Base *base = new Base();
   Base *sub1 = new Sub1();
   Base *sub2 = new Sub2();

   if(typeid(*base) == typeid(Base))
   {
      cout << "Yeah! I'm an instance of Base!!" << endl;
   }
   
   if(typeid(*sub1) == typeid(Sub2))
   {
      cout << "Hi! I'm an instance of Sub2!!" << endl;
   }
   else
   {
      cout << "Boooo... I'm not an instance of Sub2!!" << endl;
   }
   
   if(typeid(*sub2) == typeid(Sub2))
   {
      cout << "Hi! I'm an instance of Sub2!!" << endl;
   }
   else
   {
      cout << "Boooo... I'm not an instance of Sub2!!" << endl;
   }

   delete base;
   delete sub1;
   delete sub2;

   return 0;
}
実行結果は以下のとおり。
Yeah! I'm an instance of Base!!
Boooo... I'm not an instance of Sub2!!
Hi! I'm an instance of Sub2!!
実は最初試したときはvirtual関数を一つも書いていなかったので、POD型としてコンパイルされる->実行時型情報がとれないということになっていたっぽい。なので上記コードのvirtualなデストラクタは一見無意味ですが、つくっておかないと望んだ結果は得られません。まあ普通は作るよね…。

strcmpで比較するより短く書け、dynamic_castでいちいち型を調べていくより効率良さそうな方法だと思う。早速取り入れてみよう。

参考サイト

0 件のコメント:

コメントを投稿