2012-05-25 2 views
1

Я использую boost::signals2 библиотеку и вот простой код:Сигналы и связывающие аргументы

boost::signals2<void()> sig; 
class Foo { 
    void Slot() {} 
}; 

Foo obj; 
sig.connect(boost.bind(&Foo::Slot, &obj)); 

Все работает хорошо. Но теперь я хочу, чтобы мой сигнал передать некоторые данные в качестве аргументов:

boost::signals2<void (std::vector<float>)> sig2; 
class Foo { 
    void Slot2(std::vector<float>) {} 
}; 

Что такое правильный способ связать slot2 снова сигнал?

Это ошибка: http://dpaste.com/752076/, когда я использую то же соединение & код привязки.

ответ

8

Вы должны использовать заполнители:

sig.connect(boost::bind(&Foo::Slot, &obj, _1)); 
2

Вы должны прочитать Automatic Connection Management, где подобный пример существует о том, как подключить слот, который принимает аргументы.

В вашем случае это выглядит так:

#include <boost/signals2.hpp> 
#include <vector> 

struct Foo { 
    void Slot1() {} 
    void Slot2(std::vector<float>) {} 
}; 

int main() 
{ 
    typedef boost::signals2::signal<void()> st1; 
    typedef st1::slot_type sst1; 
    typedef boost::signals2::signal<void (std::vector<float>)> st2; 
    typedef st2::slot_type sst2; 

    st1 sig1; 
    st2 sig2; 

    Foo foo; 

    sig1.connect(sst1(&Foo::Slot1, foo)); 
    sig2.connect(sst2(&Foo::Slot2, foo, _1)); 

    sig1(); 
    std::vector<float> v(5,2.2); 
    sig2(v); 
}