2

クラスを適切に設計できなかったため、次のようなものが必要になるようになりました。

struct A
{
   A( function< void(string&) cb > ): callback(cb) {}
   function< void(string&) > callback;

   template <std::size_t T>
   void func( string& str) { ... }
}

int main(){
vector<A> items = {
   A( bind( &A::func<1>, items[0], _1) ),
   A( bind( &A::func<2>, items[1], _1) ),
   ...
}

これは安全に使用できますか?そうでない場合、代替手段はありますか?

4

3 に答える 3

6

これは確かに安全ではありません。は、初期化items[0]される前に評価されitemsます。

ここで行う適切なことは、おそらくラムダを使用することです。

vector<A> items = {
    A( [&items](string& s){ items[0].func(s); } ),
    A( [&items](string& s){ items[1].func(s); } ),
    ...
}

itemsこれは、初期化中にのみ参照を取得しitems[0]、コールバックが実際に呼び出されたときにのみプルします。

A&または、をパラメータとして受け取るようにコールバックを変更できますか?コールバックタイプがの場合は、コールバックとしてstd::function<void(A&, string&)>渡すだけで&A::func<1>機能します。

于 2013-01-09T22:06:11.177 に答える
5

[]作成する前に、演算子を使用してにアクセスしていますvector。これは安全ではありません。

で完全に初期化されていないアイテムを作成しvector、後でバインド先を設定する必要があると思います。

于 2013-01-09T22:05:56.677 に答える
0

のコードmainは、固定サイズのベクトルを作成します。それが実際に必要な場合は、配列またはを使用して、要素のアドレスを呼び出しにstd::array渡します。bind

A items[] = {
   A( bind( &A::func<1>, &items[0], _1) ),
   A( bind( &A::func<2>, &items[1], _1) ),
   ...
};

によって返される関数オブジェクトは、オブジェクトbindへのポインタとメンバー関数をバインドする方法を知っています。

于 2013-01-09T22:37:23.740 に答える