我正在研究一个小型图形引擎项目,我希望它能够跨越平台(有一天).我一直在使用最新版本的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;
Run Code Online (Sandbox Code Playgroud)
然后我可以通过以下方式添加一个监听器:
addScrollListener([](int p){/* Do something here */});
Run Code Online (Sandbox Code Playgroud)
正如我所说,这在MinGW中工作正常,但在Visual Studio中失败,有没有办法做到这一点所以它可以在两者中工作,甚至可以将lambdas存储在VS atm中?
如果您需要查看更多代码,可以在http://code.google.com/p/aotk/source/browse/找到它们.lambda映射位于window.h/window.cpp中
而不是这个:
std::map<int,void (*)(int p)> scrollListenerFunctions;
Run Code Online (Sandbox Code Playgroud)
你必须有这个:
std::map<int,std::function<void(int p)> > scrollListenerFunctions;
Run Code Online (Sandbox Code Playgroud)
问题是lambda不能转换为函数指针.你需要一个更通用的回调包装器,比如std::function