システムの場合、ポインターを long に変換してから long をポインター型に戻す必要があります。ご想像のとおり、これは非常に危険です。私がやりたかったのは、変換を行うために dynamic_cast を使用することです。それらを混合すると、null ポインターが得られます。このページにはhttp://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=/com.ibm.vacpp7l.doc/language/ref/clrc05keyword_dynamic_cast.htmと書かれています
dynamic_cast オペレーターは、実行時に型変換を実行します。dynamic_cast 演算子は、基本クラスへのポインターから派生クラスへのポインターへの変換、または基本クラスを参照する左辺値から派生クラスへの参照への変換を保証します。これにより、プログラムはクラス階層を安全に使用できます。この演算子と typeid 演算子は、C++ でランタイム型情報 (RTTI) をサポートします。
nullの場合はエラーを取得したいので、独自の動的キャストを作成しました
template<class T, class T2> T mydynamic_cast(T2 p)
{
assert(dynamic_cast<T>(p));
return reinterpret_cast<T>(p);
}
MSVC を使用すると、「エラー C2681: 'long' : dynamic_cast の無効な式タイプ」というエラーが表示されます。これは、仮想関数を持つクラスでのみ機能することがわかりました... WTF! 動的キャストのポイントがアップ/ダウン キャストの継承の問題であることは知っていますが、型キャストの問題を動的に解決することも考えていました。reinterpret_cast を使用できることはわかっていますが、同じタイプの安全性は保証されません。
タイプキャストが同じタイプかどうかを確認するには、何を使用すればよいですか? 2 つの typeid を比較することはできますが、派生をそのベースに型キャストしたい場合に問題が発生します。では、どうすればこれを解決できますか?