Visual c++ 在集合中使用函数委托比使用lambda有什么优点/缺点?

Visual c++ 在集合中使用函数委托比使用lambda有什么优点/缺点?,visual-c++,lambda,delegates,c++11,Visual C++,Lambda,Delegates,C++11,在我的库的开发过程中,我正处于一个非常无聊的阶段,我想基于windows消息标识符和WPARAM和LPARAM参数构造一个类。这些函数的原型很简单: boost::shared_ptr<EventArgs>(const UINT& _id, const WPARAM& _w, const LPARAM& _l); 一切正常。但后来我在想,与其让所有这些代理都在场,为什么不利用C++0x中的lambdas呢?因此,我很快就制作了以下原型: typedef st

在我的库的开发过程中,我正处于一个非常无聊的阶段,我想基于windows消息标识符和
WPARAM
LPARAM
参数构造一个类。这些函数的原型很简单:

boost::shared_ptr<EventArgs>(const UINT& _id, const WPARAM& _w, const LPARAM& _l);
一切正常。但后来我在想,与其让所有这些代理都在场,为什么不利用C++0x中的lambdas呢?因此,我很快就制作了以下原型:

typedef std::map<int, std::function<boost::shared_ptr<EventArgs>(const WPARAM&, const LPARAM&)> > MapType;
typedef MapType::iterator mit;

MapType map;
map[WM_WHATEVER] = [](const WPARAM& _w, const LPARAM& _l) { /* create appropriate eventargs class given parameters */ };
map[WM_ANOTHER] = ....;
// and so on
typedef std::map MapType;
typedef-MapType::迭代器mit;
地图类型图;
map[WM_WHATEVER]=[](const WPARAM&_w,const LPARAM&_l){/*在给定参数的情况下创建适当的eventargs类*/};
map[WM_other]=。。。。;
//等等
同样,查找和调用也很简单:

mit m = map.find(WM_PAINT);
boost::shared_ptr<EventArgs> e(m->second(_wParam, _lParam));
// dispatch e
mitm=map.find(WM_-PAINT);
boost::共享内存(m->second(wParam,lParam));
//派遣e

以这种方式使用lambdas是否有优势?我知道查找正确的委托/ lambda的开销将是一样的(因为这两种映射都是用<代码> int <代码>键的),但是我的目标是尽可能高效地用我的友好C++方式从WNDPROC发送消息。我的直觉是lambdas会更快,但不幸的是,我缺乏理解编译器优化的经验,无法对此做出判断,因此我在这里提出了问题:)哦,根据问题的主题,有什么我没有想到的地方吗?

我在这里看到了两个真正的区别:

第一个是如何存储回调:fast委托或std::函数。后者基于boost::function,而fast委托是专门设计来超越这些委托的。然而,std::function符合标准,而fast委托则不符合标准

另一个区别是设置代码的方式,我认为lambdas在这里有明显的优势。您可以在重要的地方编写实际的代码,不需要定义一个只用于特定用途的单独函数


如果您想要原始速度快的代理可能会赢(但如果这是一个参数,您应该进行基准测试),但是如果您想要可读性和标准一致性,请使用std::function和lambdas。

感谢您的回答,您是对的
fastdelegate
(我以前使用过)确实具有非常好的性能。但是,正如您所指出的,使用lambdas,我可以使用匿名函数创建一个非常可读的映射初始化,正如您所指出的,该函数只用于一个目的。正如你所说,我现在不知道性能是否会成为一个问题!
typedef std::map<int, std::function<boost::shared_ptr<EventArgs>(const WPARAM&, const LPARAM&)> > MapType;
typedef MapType::iterator mit;

MapType map;
map[WM_WHATEVER] = [](const WPARAM& _w, const LPARAM& _l) { /* create appropriate eventargs class given parameters */ };
map[WM_ANOTHER] = ....;
// and so on
mit m = map.find(WM_PAINT);
boost::shared_ptr<EventArgs> e(m->second(_wParam, _lParam));
// dispatch e