2011-10-10 14 views
5

std :: bindを使用してboost :: signals2 :: signal :: connect()にメンバー関数を渡すことは安全ですか?言い換えれば、boost :: bindとstd :: bindは互換性がありますか?boost :: signals2でstd :: bindを使用するのは安全ですか?

これはVC++ 2010 SP1でコンパイルされますが、テンプレートコードは私の頭を越えています。私は未定義の動作領域に入る可能性があります。

答えて

1

connect機能は、基本的には、それのために定義されたoperator()を持って汎用ラッパーですboost::functionオブジェクトを取ります。したがって、あなたが縛っているものとまったく同じくらい安全です。

例えば、これは合理的に安全である:

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ライブラリは汎用的に設計されているため、通常は実装の詳細を選択しません。

関連する問題