我想知道这是不是一种被接受的编写回调的方法:
存储回调:
struct EventHolder {
std::function<void()> Callback;
EventTypes::EventType Type;
};
std::vector<Events::EventHolder> EventCallbacks;
方法定义:
void On(EventType OnEventType,std::function<void()>&& Callback)
{
Events::EventHolder NewEvent;
NewEvent.Callback=std::move(Callback);
NewEvent.Type=OnEventType;
EventCallbacks.push_back(std::move(NewEvent));
}
绑定事件:
Button->On(EventType::Click,[]{
// ... callback body
});
我最大的问题是如何通过值传递回调函数。这是一个有效的方法吗?
发布于 2013-03-27 14:06:31
是。函数要么是原始函数指针,要么是轻量级类,它们的拷贝构造函数没有副作用,所以它们的拷贝必须作为原始对象,所以这种方法是完全可以的。但是为什么要通过值传递对象,然后将其移动到原始容器中,您可以传递引用,然后将其复制到容器中,并拥有一个接受r值引用的重载函数(这并不重要)。
发布于 2020-09-29 23:36:42
我几乎也遇到了同样的问题。我想知道有多少监视器存在,它们在哪里。
至少我放弃了,写了一个简短的结构。不是很好,但我只想要信息。
甚至Lambda我都试过了,因为Lambda的定义没有机会...不是固定地址,第二个无法构造为回调...
#include <WinUser.h>
#include <vector>
using namespace std;
struct _sMonitors{
struct DispInfo {
HMONITOR hMon;
// HDC dcMon; // Everytime NULL (What ever!)
RECT pRcMon;
};
list< DispInfo> List;
_sMonitors() {
EnumDisplayMonitors(0, 0, Func, (LPARAM)this);
}
BOOL static CALLBACK Func(HMONITOR hMon, HDC dcMon, LPRECT pRcMon, LPARAM lParam){
auto& Struct = *((_sMonitors*)lParam);
Struct.List.push_back({ hMon,*pRcMon });
return 1;
}
};
_sMonitors Monitors;
用我的语言来说就是这样!我不知道怎么回事……
https://stackoverflow.com/questions/15652761
复制相似问题