2013/06/04

C++ に instanceof が無い!

C++でJavaの"instanceof"を行う方法。
参考:cprogramming.com
template <typename Of, typename What>
inline bool instanceof(const What &w)
{
  return dynamic_cast<const Of*>(&w) != 0;
} 
と定義して
 instanceof<Foo>(bar)
で行けるようだ。
この書き方では bar はポインタでなく直接の値を渡して判定する。
↓のようにするとポインタ渡しで判定できる。
template <typename Of, typename What>
inline bool instanceof(const What w)
{
  return dynamic_cast<const Of*>(w) != 0;
} 

 instanceof<Foo>(barPtr)
になる。どっちが良いのか分からんがJavaと同じ感覚で使えるのは後者か?

このinstanceofはざっくり言ってキャスト出来るか出来ないかを返して欲しい機能。
具体的にはアニマルクラスとその派生のキャットクラス、ドッグクラスがある場合、アニマルとして渡されたポインターが、ほんとはキャットなのかドッグなのか判断したいときに使える。(OOP的には場合分けする処理じゃなくてアニマルのまま処理できるようにした方が良いんだろうが何もかもうまく作れる分けじゃないし)

これっていきなりdynamic_castしてみてNULLじゃなければ、って書いても同じことだな…

VC++にisinf、finiteが無い!

(Pow関数をきっちり使うならこっちの記事が良いです)
math.pow(x,n)の結果がINF(数値外だかfloating point exceptionだか)になってしまったのでエラーハンドリングしようと思った。
しかし間違いなく<math.h>をインクルードしてるにも関わらず isinfも finiteも定義されていないと言われる。
しかしどんなに調べてもC++にはmath.hにisinf、finiteがあるの一点張り。

VC++では<float.h>をインクルードしてアンダースコア付きの _finite という関数を使うと良いらしい。
#include <float.h>
~~
if(!_finite(ans)){
   return -1;
}
C++とVC++って何でこんなびみょ~~な違いがあるの?

0 件のコメント:

コメントを投稿