因此,为了自己的方便,我正在开发一个简单的 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)'
因为指针类型不一样,尽管是从基类继承的。那么有没有人想提出一个解决方案,同时仍然保持这种方法?如果没有,我也愿意接受您认为会使消息处理比这种方式更方便的建议。