我正在研究一个小型图形引擎项目,我希望它能够跨越平台(有一天)。我一直在使用最新版本的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
答案 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
。