3

Ref ライブラリは、通常は引数のコピーを取る関数テンプレート (アルゴリズム) への参照を渡すのに役立つ小さなライブラリです。

http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_server.cppから

インコール配信 -

  void deliver(const chat_message& msg)
  {
    recent_msgs_.push_back(msg);
    while (recent_msgs_.size() > max_recent_msgs)
      recent_msgs_.pop_front();

    std::for_each(participants_.begin(), participants_.end(),
        boost::bind(&chat_participant::deliver, _1, boost::ref(msg)));
  }

もし

void deliver(const chat_message& msg)

別のクラスで参照によってメッセージを取得しているのに、なぜ boost::ref が使用されるのですか?

4

2 に答える 2

5

boost::bindはその入力のコピーを作成するためboost::ref、この場合に が使用されていない場合は、 のコピーがchat_message作成されます。そのため、コードの作成者はそのコピーを避けたいと考えているようです ( boost::ref1 つまたは 2 つのオブジェクトをインスタンス化することを犠牲にして)。これは、chat_messageサイズが大きい場合やコピーに費用がかかる場合に意味があります。boost::crefただし、オリジナルは const 参照によって渡され、呼び出しは渡されたメッセージを変更してはならないため、a を使用する方が理にかなっています。

std::bind: 上記はおよびに適用されstd::tr1::bindます。

于 2013-05-29T07:09:48.787 に答える
0

bind が取る引数は、返された関数オブジェクトによってコピーされ、内部的に保持されます。たとえば、次のコードでは:

int i = 5;

bind(f, i, _1); i の値のコピーが関数オブジェクトに格納されます。boost::ref と boost::cref を使用して、関数オブジェクトにコピーではなくオブジェクトへの参照を格納させることができます。

http://www.boost.org/doc/libs/1_53_0/libs/bind/bind.htmlから

于 2013-05-29T07:14:55.513 に答える