因此,为了方便起见,我正在开发一个简单的 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 是我创建的各种类和对象的命名空间)
只是有点令人讨厌,但让我解释一下我的过程和推理。我创建了一个名为 Abstract Window 的类,它以非常面向对象的方式包含窗口的大部分功能。
我现在正在研究一种获取私有成员函数的方法,并通过指向它们的指针将它们存储在映射中,这些指针由它们应该处理的 Windows 消息标识。这样,当 Windows 过程收到消息时,它会深入查看此映射以查看您是否已为其安装了处理程序。如果有,则调用该函数并退出。如果没有,它将调用 DefWindowProc 并退出。很容易。
然而,这个对象永远不应该被实例化,而只是应该继承和扩展。问题是,map 的函数指针声明是 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)'
因为尽管是从基类继承的,但指针类型并不相同。那么有人希望在保留这种方法的同时提出一个解决方案吗?如果没有,我也愿意接受您认为会使消息处理比这种方式更方便的建议。