Храните лямбда-функции C ++ 0x в std :: map / vector для дальнейшего использования в Visual Studio - PullRequest
5 голосов
/ 09 июля 2011

Я работаю над небольшим графическим движком, и я хочу, чтобы его пересекли платформу (когда-нибудь).Я разрабатывал с последней версией MinGW и C ++ 0x.Для слушателей событий я использую лямбда-функции, хранящиеся в std :: map, которые будут вызываться при возникновении определенного события.С MinGW он работает очень гладко, но на днях, когда я попробовал его в Visual Studio (последняя версия), он не удался.

Я проверил тип лямбд, и даже если я определю две лямбды, чтобы они были одинаковоони получают разные типы (анонимное пространство имен :: и анонимное пространство имен :)).

Например, у меня есть эта std :: map для хранения слушателей прокрутки

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

А затем я могу добавить слушателя, просто сделав:

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

Как ясказал, что это прекрасно работает в MinGW, но терпит неудачу в Visual Studio, есть ли способ сделать это, чтобы он работал в обоих и даже возможно ли сохранить лямбда-символы в VS atm?

Если вам нужно увидеть / нужно увидетьбольше кода вы можете найти здесь http://code.google.com/p/aotk/source/browse/ лямбда-карты расположены в window.h / window.cpp

Ответы [ 2 ]

7 голосов
/ 09 июля 2011

вместо этого:

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

вы должны иметь это:

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

Дело в том, что лямбда не конвертируется в указатель функции.Вам нужна более универсальная оболочка обратного вызова, например std::function

5 голосов
/ 09 июля 2011

Лямбды без сохранения состояния могут преобразовываться в указатели функций, но Visual Studio пока не поддерживает их, они были добавлены после того, как они реализовали лямбды.Вы действительно должны использовать std::function в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...