2010-07-21 54 views
3

我有一個類,信號成員封裝了boost :: function。傳遞boost :: signal作爲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 
} 

回答

7

使用類型「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); 
+0

THX利息內部聲明,但它並沒有爲我工作。 – Eugene 2010-07-21 10:08:29

+0

啊,它有棘手的返回類型 – Alsk 2010-07-21 13:33:52

+0

的回答是糾正 – Alsk 2010-07-21 13:42:04