Обработка сигнала 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 или выше, чтобы эти функции правильно компилировались.

Другие вопросы по тегам