2013-05-13 61 views
0

我有一個名爲Candidate的類,其中包含一個名爲DataUpdate()的函數。我打算動態地創建Candidate的許多實例,並讓每個實例將其功能DataUpdate()作爲插槽連接到boost.signals2信號;準備好接收信號。使用boost.signals2如何將動態分配的對象連接到信號

我在下面開發是給錯誤的代碼:

Error 2 error C2276: '&' : illegal operation on bound member function expression

我不能確定正確的代碼,以達到預期的效果。問題似乎在於解引用指針candidateInstance以獲取實例的DataUpdate()函數的地址傳遞給signal.connect()。有沒有人能夠建議正確的方法?

Candidate *candidateInstance; 

//INSTANTIATE CANDIDATE INSTANCE 
++DataStream::ID;//increment static variable 
candidatesVector.push_back(candidateInstance = new Candidate(ID)); 

//CONNECT DATAUPDATE() OF CANDIDATE INSTANCE 
signal.connect(&((*candidateInstance).DataUpdate)); 

//FIRE SIGNAL 
signal(BarNumber(), DateTime(), Open(), High(), Low(), Close()); 

回答

2

您應該使用bind來創建成員函數的包裝。

#include <iostream> 
#include <memory> 
#include <functional> 

#include <boost/signals2.hpp> 

class Foo 
{ 
public: 
    void foo() 
    { 
     std::cout << "I'm foo() from Foo, this == " << this << std::endl; 
    } 
}; 

int main() 
{ 
    auto foo_ptr = std::make_shared<Foo>(); 

    boost::signals2::signal<void()> sig; 

    sig.connect(std::bind(&Foo::foo, foo_ptr)); 

    sig(); 

    return 0; 
} 
+0

所以我嘗試使用你建議的格式,但這一行; signal.connect(std :: bind(std :: mem_fn(&Candidate :: DataUpdate),candidateInstance.get()));給出錯誤;錯誤C2064:術語不計算帶有6個參數的函數。有關如何解決它的任何想法?謝謝。 @soon – GoFaster 2013-05-13 16:38:50

+0

看起來你的函數比我的答案中表示的函數更多的參數。在這種情況下,您應該使用[佔位符](http://en.cppreference.com/w/cpp/utility/functional/placeholders)。 – soon 2013-05-13 16:44:46

+0

'bind'不需要'mem_fn'並​​且可以綁定到'shared_ptr':'bind(&Foo :: foo,foo_ptr);' – 2013-05-13 17:48:20