将C ++ 0x lambda函数存储在std :: map / vector中,以便稍后在Visual Studio中使用

时间:2011-07-09 10:11:32

标签: lambda c++11

我正在研究一个小型图形引擎项目,我希望它能够跨越平台(有一天)。我一直在使用最新版本的MinGW和C ++ 0x进行开发。 对于事件监听器,我使用存储在std :: map中的lambda函数,这些函数将在某个事件发生时被调用。它与MinGW一起工作非常顺利,但有一天,当我在Visual Studio(最新版本)中尝试它时,它失败了。

我检查了lambda的类型,即使我将两个lambdas定义为相同,它们也会得到不同的类型(annonymous namespace :: and annonymous namespace::))。

例如,我有这个std :: map来存储滚动侦听器

std::map<int,void (*)(int p)> scrollListenerFunctions;

然后我可以通过以下方式添加一个监听器:

addScrollListener([](int p){/* Do something here */});

正如我所说,这在MinGW中工作得很好,但在Visual Studio中失败了,有没有办法做到这一点所以它可以在两者中工作,甚至可以在Lamb atm中存储lambda?

如果您需要查看更多代码,可以在http://code.google.com/p/aotk/source/browse/找到它.lambda映射位于window.h / window.cpp

2 个答案:

答案 0 :(得分:7)

而不是:

std::map<int,void (*)(int p)> scrollListenerFunctions;

你必须有这个:

std::map<int,std::function<void(int p)> > scrollListenerFunctions;

问题是lambda不能转换为函数指针。您需要一个更通用的回调包装器,如std::function

答案 1 :(得分:5)

无状态lambdas可以转换为函数指针,但Visual Studio还不支持它,它是在实现lambdas之后添加的。无论如何,你真的应该使用std::function