Pass boost :: signal as boost :: function - PullRequest
3 голосов
/ 21 июля 2010

У меня есть класс с сигнальным членом, инкапсулированным с boost :: function.

Можно ли добавить другой сигнал в качестве обработчика с этим API?

class Foo
{
public:
  VOID AddHandler(boost::function<VOID()> handler)
  {
     m_signal.connect(handler);
  }

private:
  boost::signal<VOID()> m_signal;
};

boost::signal<VOID()> signal;

VOID SignalCaller()
{
    signal();
}

int main( )
{ 
   Foo foo;
   //foo.AddHandler(signal); // I want to
   foo.AddHandler(&SignalCaller); // I have to
}

1 Ответ

7 голосов
/ 21 июля 2010

используйте тип "slot_type", который объявлен внутри вашего типа сигнала

class Foo
{
public:
    typedef boost::signal0<void> Signal;
    typedef Signal::slot_type Slot;

    //allowed any handler type which is convertible to Slot
    void AddHandler(Slot handler)
    {
        m_signal.connect(handler);
    }
private:
  Signal m_signal;
};

void f()
{
    std::cout << "f() called";
}

//usage
    Foo foo;
    foo.AddHandler(signal);
    foo.AddHandler(&f);
...