T *ポインタが指すオブジェクトが本当にTオブジェクトなのか、それとも他の無関係なタイプなのかを判断しようとしています。dynamic_castを試しましたが、役に立たないわけではありません。有効なTオブジェクトを指していないことが明らかな場合でも、nullではなくポインタ自体を返します。
Object* garbage = reinterpret_cast<Object*>(0x12345678);
if( dynamic_cast<Object*>(garbage) == NULL ){
cout << "Expected behaviour (by me)" << endl;
}else{
cout << "You've got to be kidding me" << endl;
}
これ、または他の解決策の回避策はありますか?dynamic_castが役に立たない前にvoid*とchar*にキャストしようとしましたが、サブクラスも受け入れたいので、typeidも十分ではありません。
いくつかのコンテキスト:とのような異なる種類の配列間の浅い変換を実装するカスタム配列クラスを作成しています。たとえば、すべての要素アクセスで動的型チェックを実行することにより、最小限の型の安全性を保証したいと思いますArray<Object*>
。Array<String*>
#define DEBUG
Array<String*> v(10);
Array<Object*> o = v;
o[0] = new Integer(1); // this is technically illegal but no idea how to check
//Array<String*> w = o; // this fails with an exception
String* str = v[0]; // but this should fail horribly as well
cout << str << endl;
Object *にキャストしてから、Object *の型チェックを行うことは多くの場合に機能しますが、の場合は失敗します。ただし、を使用せずにArray<Object*>
Object以外のものをに挿入できるかどうかはわかりません。Array<Object*>
reinterpret_cast。