Обработка сигнала C ++ libsigc ++ с помощью лямбда-функции - PullRequest
8 голосов
/ 13 мая 2011

Я работаю над кодом C ++, который использует libsigc ++ для передачи сигналов (событий).

Я довольно новичок в C ++, и я склонен думать в C #.Код, эквивалентный тому, что я хочу в C #, будет выглядеть примерно так:

var names = new List<string>();
thing.Happened += (string name) => names.Add(name);
thing.DoStuff();

Учебники libsigc ++ показывают, как связать функцию или член с сигналом, ноЯ не хочу определять новый метод уровня класса для такого простого метода, который действительно должен быть закрытым образом инкапсулирован в его клиенте, по крайней мере, на мой взгляд.

API libsigc ++, кажется, поддерживает лямбда-выражения, ноЯ не нашел примеров, показывающих, как их использовать.Кто-нибудь может мне помочь?Помните, что я новичок в C ++!

Ответы [ 3 ]

6 голосов
/ 13 мая 2011

Лямбды - это просто функциональные объекты.Поэтому везде, где вы можете использовать произвольный (то есть шаблонный) функтор, вы можете использовать лямбду.

У меня не установлена ​​библиотека, поэтому я не могу проверить это, но, глядя на этот пример, я считаю, что эта модификация должна работать:

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

Я не был полностью уверен в этом ответе, так как не смог его протестировать.Я нашел этот конструктор для класса слота в документации, и, поскольку я никогда не сталкивался с шаблоном конструктора в шаблоне класса, я не был уверен, что все типы смогут разрешить.Так или иначе, я написал тест, используя только стандартную библиотеку, которая делает что-то вроде того, что делает этот конструктор, и это работает. Вот оно

1 голос
/ 13 мая 2011

C ++ 0x поддерживает лямбды и, вероятно, позволит вам сделать что-то похожее на то, что вы делаете в C #. Посмотрите, какие компиляторы C ++ уже поддерживают лямбду? для готовых компиляторов C ++ 0x.

0 голосов
/ 13 мая 2011

Этот сайт на MSDN имеет очень хорошо продуманную и всестороннюю информацию о лямбда-функции, а также об использовании ключевого слова auto в C ++ 0x.Здесь есть несколько действительно полезных примеров, а также связь между лямбдами и объектами-функциями из более ранних версий C ++.Обратите внимание, что вам, возможно, придется использовать флаги -std=c++0x или 1std=gnu++0x, если вы используете g ++ версии 4.4 или выше, чтобы эти функции правильно компилировались.

...