2
在c#中我們有event關鍵字,它是一種特殊的委託類型,只能用聲明它的類來調用。那麼,在使用boost :: signals2的本地C++中是否有這樣做的方法,如果是這樣,從性能角度看它是否很昂貴?C++ boost信號2
在c#中我們有event關鍵字,它是一種特殊的委託類型,只能用聲明它的類來調用。那麼,在使用boost :: signals2的本地C++中是否有這樣做的方法,如果是這樣,從性能角度看它是否很昂貴?C++ boost信號2
一般而言,限制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 &,做在那裏的結合,如果你的模型具有足夠的剛度。
至於性能方面,虛擬類型通過一個好的編譯器實際上是免費的,這個機制是一個額外的函數調用或每個處理程序一次(不是每個信號)一次。