首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将lambda函数作为回调传递和存储

将lambda函数作为回调传递和存储
EN

Stack Overflow用户
提问于 2013-03-27 13:59:55
回答 2查看 24.2K关注 0票数 24

我想知道这是不是一种被接受的编写回调的方法:

存储回调:

代码语言:javascript
复制
struct EventHolder {
    std::function<void()> Callback;
    EventTypes::EventType Type;
};
std::vector<Events::EventHolder> EventCallbacks;

方法定义:

代码语言:javascript
复制
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));
}

绑定事件:

代码语言:javascript
复制
Button->On(EventType::Click,[]{
    // ... callback body
});

我最大的问题是如何通过值传递回调函数。这是一个有效的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2013-03-27 14:06:31

是。函数要么是原始函数指针,要么是轻量级类,它们的拷贝构造函数没有副作用,所以它们的拷贝必须作为原始对象,所以这种方法是完全可以的。但是为什么要通过值传递对象,然后将其移动到原始容器中,您可以传递引用,然后将其复制到容器中,并拥有一个接受r值引用的重载函数(这并不重要)。

票数 1
EN

Stack Overflow用户

发布于 2020-09-29 23:36:42

我几乎也遇到了同样的问题。我想知道有多少监视器存在,它们在哪里。

至少我放弃了,写了一个简短的结构。不是很好,但我只想要信息。

甚至Lambda我都试过了,因为Lambda的定义没有机会...不是固定地址,第二个无法构造为回调...

代码语言:javascript
复制
#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;

用我的语言来说就是这样!我不知道怎么回事……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15652761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档