2011-10-10 117 views
5

使用std :: bind安全地傳遞一個成員函數來boost :: signals2 :: signal :: connect()?換句話說,boost :: bind和std :: bind是可以互換的嗎?使用boost :: signals2使用std :: bind是否安全?

它使用VC++ 2010 SP1編譯,但模板代碼超出了我的腦海,恐怕我可能冒險進入未定義的行爲領域。

回答

1

connect函數採用一個boost::function對象,這基本上是圍繞任何具有爲它定義的operator()一個通用的包裝。因此,它與您約束的內容完全一樣安全。

例如,這是合理的安全:

boost::shared_ptr<ClassName> pValue = boost::make_shared<ClassName>(...); 
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...); 

這是相當安全的,因爲它存儲boost::shared_ptr作爲其數據的一部分。

ClassName *pValue = new ClassName(...); 
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...); 

這是有條件安全。如果該連接仍然存在,並且您執行delete pValue,它會立即變得不安全。

就個人而言,我不太相信「條件安全」,但這取決於你。重要的是,只要綁定,您綁定到boost::bind的所有東西都必須繼續存在。

2

我沒有經歷過這個主題,我期望connect採取任何實現有效的函數調用操作符。用任何匹配簽名的函數或函數對象來調用它應該是安全的,無論是boost :: bind,std :: bind還是其他任何東西。 Boost庫被設計成通用的,所以他們通常不會去選擇其他的實現細節。