void*
キャストは、 の値を void へのポインタ型の値に変換しようとしますptrtofun
。C++ は、ポインターからメンバー関数へのそのような変換を提供しません。そのためvoid*
、何か問題があります (おそらくコンパイルされません)。
void*&
キャストは参照を作成します。その参照先は、 object が占有sizeof(void*)
する最初のバイトから始まるメモリの最初のバイトptrtofn
です。ptrtofun
は型も互換型も持たずvoid*
、 と同じサイズである必要さえありませんvoid*
。したがって、参照を使用すると未定義の動作が発生します (厳密なエイリアシングの違反です) が、コンパイラは問題をキャッチする必要はありません。
メンバーへのポインター関数を移植可能に出力する唯一の方法は、sizeof(ptrtofun)
から始まるバイトを出力すること(unsigned char*)(&ptrtofun)
です。これらのバイトをどのように表現するかを自分で正確に決めることができますが (16 進数は明らかな選択です)、結果が必ずしも のコードのメモリ内のアドレスではないことに注意してくださいTestClass::MyFunc
。メンバー関数へのポインターは、単にそのようには機能しません。たとえば、仮想関数へのポインターを許可する必要があるためです。これは、呼び出されるオブジェクトの動的な型に応じて異なるコードを呼び出します。