2011-09-19 41 views
2

在c#中我們有event關鍵字,它是一種特殊的委託類型,只能用聲明它的類來調用。那麼,在使用boost :: signals2的本地C++中是否有這樣做的方法,如果是這樣,從性能角度看它是否很昂貴?C++ boost信號2

回答

3

一般而言,限制C++函數的可調用性的方法依賴於傳遞類型的虛擬參數,該類型不能在該類之外實例化(私有工廠或帶有'friend'聲明的構造函數)。

將此應用於boost :: signals2 :: signal會導致信號定義具有多餘的參數。

如果您確實需要使其不可調用,請記住它只是一個對象成員(至少,因爲我使用它...) - 您可以將其聲明爲私有或受保護成員並提供公共功能連接到它。

class FooEmitter 
{ 
public: 
    boost::signals2::scoped_connection ConnectToFoo(boost::function<void (Emitter&)>& handler) 
    { 
     return fooSignal.connect(handler); 
    } 

    void triggerFoo() { 
     fooSignal(*this); 
    } 
private: 
    boost::signals2::signal<void (Emitter&)> fooSignal; 
}; 

class FooHandler 
{ 
public: 
    FooHandler() 
    { 
     fooConnection = getAnEmitter().ConnectToFoo(boost::bind(&FooHandler::HandleFoo, this, _1); 
    } 

    void HandleFoo(Emitter&) 
    { 
     // handler body 
    } 

private: 
    boost::signals2::scoped_connection fooConnection; 
} 

你當然可以重新安排ConnectToFoo方法採取FooHandler &,做在那裏的結合,如果你的模型具有足夠的剛度。

至於性能方面,虛擬類型通過一個好的編譯器實際上是免費的,這個機制是一個額外的函數調用或每個處理程序一次(不是每個信號)一次。