C++ 我可以使用成员函数作为枚举窗口的第一个参数吗
我可以使用成员函数作为C++ 我可以使用成员函数作为枚举窗口的第一个参数吗,c++,windows,winapi,C++,Windows,Winapi,我可以使用成员函数作为EnumWindows的第一个参数吗?在这种情况下,即使使用boost::bind给定此正常回调函数,我也看不到任何解决方法: BOOL CALLBACK EnumWindowsProc(HWND wnd, LPARAM lParam); 您可以使用lParam调用EnumWindows,向其传递指向您的类的指针: EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(this)); 如果不想公开类方法,
EnumWindows
的第一个参数吗?在这种情况下,即使使用boost::bind
给定此正常回调函数,我也看不到任何解决方法:
BOOL CALLBACK EnumWindowsProc(HWND wnd, LPARAM lParam);
您可以使用lParam
调用EnumWindows
,向其传递指向您的类的指针:
EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(this));
如果不想公开类方法,可以:
- 打包结构以同时包含类实例和指向成员的指针
- 使用代理库
- 使用boost
(在这种情况下,它会很好地工作,因为您可以在自己的类成员上执行它,而不必是std:bind
)\uu stdcall
无论您将使用什么,您都可以在此处找到更多详细信息。EnumWindows接受如下回调
auto f = std::make_shared<func_type>(std::bind(&mymemberfunction,this));
EnumWindows(MyEnumProc,reinterpret_cast<LPARAM>(f.get()));
//Make sure to keep the shared_ptr around until you are done enumerating
BOOL回调EnumWindowsProc(HWND-HWND,LPARAM-LPARAM)代码>
不能使用具有捕获的成员函数或lambda。你可以这样做
typedef std::function<bool(HWND hwnd)> func_type;
BOOL CALLBACK MyEnumProc(HWND hwnd, LPARAM lparam)
{
auto& func = *reinterpret_cast<func_type*>(lparam);
if(func(hwnd))return TRUE;
else return FALSE;
}
typedef std::function func_type;
BOOL回调MyEnumProc(HWND-HWND,LPARAM-LPARAM)
{
auto&func=*重新解释强制转换(lparam);
if(func(hwnd))返回TRUE;
否则返回FALSE;
}
你会像这样使用它吗
auto f = std::make_shared<func_type>(std::bind(&mymemberfunction,this));
EnumWindows(MyEnumProc,reinterpret_cast<LPARAM>(f.get()));
//Make sure to keep the shared_ptr around until you are done enumerating
auto f=std::make_shared(std::bind(&mymemberfunction,this));
枚举窗口(MyEnumProc,reinterpret_cast(f.get());
//在完成枚举之前,请确保保留共享的\u ptr
或者,您可以使用lParam
创建自己的bind
函数(使用右调用约定),向其传递指向成员函数的指针…@hmjd Visual Studio2013@FrozenHeart,您应该能够使用lambda(我目前没有访问VS编译器的权限).@hmjd捕获lambdas无法转换为自由函数。@hmjd捕获lambdas显然无法转换为自由函数,因为它怎么知道从何处获取捕获的变量?你是对的,我收回我所说的。你的编译器允许将“this”的静态_转换为LPARAM?@manuell非常正确,修正了…这里写的未编译代码片段的价格@Adriano我真的很想看看std::bind案例的代码(奖金,在OP问题中)@manuell只要看看John的答案(或者我的答案中的链接到另一个SO帖子)。它有点太罗嗦了,但或多或少就是这样。