Обработка сигнала C++ libsigC++ с помощью лямбда-функции
Я работаю над кодом C++, который использует libsigC++ для передачи сигналов (событий).
Я довольно новичок в C++, и я склонен думать на C#. Код, эквивалентный тому, что я хочу в C#, будет выглядеть примерно так:
var names = new List<string>();
thing.Happened += (string name) => names.Add(name);
thing.DoStuff();
Учебные руководства по libsigC++ хорошо показывают, как связать функцию или член с сигналом, но я не хочу определять новый метод уровня класса для такого простого метода, который действительно должен быть инкапсулирован в его клиенте. хотя бы на мой взгляд.
API libsigC++ поддерживает лямбда-выражения, но я не нашел примеров, показывающих, как их использовать. Кто-нибудь может мне помочь? Помните, что я новичок в C++!
3 ответа
Лямбды - это просто функциональные объекты. Поэтому везде, где вы можете использовать произвольный (то есть шаблонный) функтор, вы можете использовать лямбду.
У меня не установлена библиотека, поэтому я не могу проверить это, но, глядя на этот пример, я считаю, что эта модификация должна работать:
int main()
{
AlienDetector mydetector;
auto warn_people = []() {
cout << "There are aliens in the carpark!" << endl;
};
mydetector.signal_detected.connect( sigc::slot<void>(warn_people) );
mydetector.run();
return 0;
}
PS
Я не был полностью уверен в этом ответе, так как не мог проверить его. Я нашел этот конструктор для класса слота в документации, и, поскольку я никогда не сталкивался с шаблоном конструктора в шаблоне класса, я не был уверен, что все типы будут в состоянии разрешить. Так или иначе, я написал тест, используя только стандартную библиотеку, которая делает что-то вроде того, что делает этот конструктор, и это работает. Вот
C++ 0x поддерживает лямбды и, вероятно, позволит вам сделать что-то похожее на то, что вы делаете в C#. Видите, какие компиляторы C++ уже поддерживают лямбду? для готовых компиляторов C++ 0x.
Этот сайт на MSDN имеет очень хорошо продуманную и всестороннюю информацию о лямбда-функции, а также об использовании auto
Ключевое слово в C++0x. В нем есть несколько действительно полезных примеров, а также связь между лямбдами и объектами-функциями из более ранних версий C++. Обратите внимание, что вам, возможно, придется использовать -std=c++0x
или же 1std=gnu++0x
Флаги, если вы используете g ++ версии 4.4 или выше, чтобы эти функции правильно компилировались.