だから私は自分の便宜のために単純な win32 ラッパーに取り組んでおり、少し複雑な問題に遭遇しました。
これには他にもたくさんのメンバーがいますが、少し省略して問題のあるメンバーだけを残しています。
class Windows::AbstractWindow
{
public:
void InstallHandler(UINT msgName, void (Windows::AbstractWindow::*)(HWND, UINT, WPARAM, LPARAM));
private:
std::map<UINT, void (Windows::AbstractWindow::*)(HWND, UINT, WPARAM, LPARAM)> HandlerIndex;
};
(記録として、この場合の Windows は、私が作成したさまざまなクラスとオブジェクトの名前空間です)
少し厄介ですが、私のプロセスと推論を説明してください。ウィンドウのすべての機能のほとんどを非常にオブジェクト指向の方法で含む AbstractWindow というクラスを作成しました。
私は現在、プライベート メンバー関数を取得し、それらへのポインターを介してマップに格納する方法に取り組んでいます。これは、処理するはずの Windows メッセージによって識別されます。このようにして、メッセージが Windows プロシージャによって受信されると、このマップを掘り下げて、そのハンドラがインストールされているかどうかを確認します。ある場合は、その関数を呼び出して終了します。そうでない場合は、DefWindowProc を呼び出して終了します。簡単です。
ただし、このオブジェクトはインスタンス化されることは想定されておらず、単に継承および拡張されることが想定されています。問題は、マップの関数ポインター宣言が AbstractWindow 型であるため、AbstractWindow から継承された型のメンバー関数ポインターを格納できないことです。例えば、
class BasicWindow : public Windows::AbstractWindow
{
public:
BasicWindow()
{
InstallHandler(WM_CREATE, &create);
}
private:
void Create(HWND, UINT, WPARAM, LPARAM) {}
}
...エラーが発生します:
error C2664: 'Windows::AbstractWindow::InstallHandler' : cannot convert parameter 2 from 'void (__thiscall BasicWindow::* )(HWND,MSG,WPARAM,LPARAM)' to 'void (__thiscall Windows::AbstractWindow::* )(HWND,UINT,WPARAM,LPARAM)'
基本クラスから継承されているにもかかわらず、ポインターの型が同じではないためです。では、この方法を維持しながら解決策を提案したい人はいますか? そうでない場合は、この方法よりもメッセージ処理が便利になると思われる提案も受け付けています。