型違いの関数ポインタを引数に渡す
C、C++では型が違っても(void* (*)(void*))にキャストしてやれば関数ポインタを引数に渡すことができるみたい(さすがに引数の数は揃えなきゃだけど)。
今会社ではWindowsとLinuxのマルチスレッドプログラムを作っています。
で、自社制作した子スレッドを作るクラスをライブラリがあって、その中で
- 外部ではAFX_THREADPROC関数にて子スレッド化したい関数を作成(UINT (*)(void*)型)
- void* (*)(void*)型にキャスト
- ライブラリの引数に指定
- ライブラリ内でAFX_THREADPROC型にキャスト
- スレッドの作成
ってしていた。これでmakeが通る。
ちなみにこの話はクラスのメンバ関数ではNG(静的メンバ関数は除く)。
多態性によりアドレスが一意に定まらないためなんだと。