21

最近、Scott Meyers の『 Effective C++ 』という素晴らしい本を読んでいます。最後のヒントの 1 つで、彼は TR1 の機能のいくつかを取り上げました。私はそれらの多くを Boost で知っていました。

ただし、私がまったく認識していないものがありました: tr1::reference_wrapper.

tr1::reference_wrapper をいつ、どのように使用しますか?

4

2 に答える 2

17

私の知る限り、これはboost::refのようなものです。基本的に、コピーできる参照。参照によってパラメーターを渡す必要がある関数にバインドする場合に非常に便利です。

例 (boost 構文を使用):

void Increment( int& iValue )
{
    iValue++;
}

int iVariable = 0;
boost::function< void () > fIncrementMyVariable = boost::bind( &Increment, boost::ref( iVariable ));

fIncrementMyVariable();

このドブス博士の記事には、いくつかの情報があります。

これが正しく、役立つことを願っています。:)

于 2008-10-11T06:26:39.513 に答える
11

reference_wrapper<T>非常に便利でシンプルなライブラリです。内部的にはreference_wrapper<T>Tへのポインタを格納します。ただし、公開するインターフェイスにはポインタ表記は含まれていません。

  • これにより、参照を他の単純なオブジェクトのように動作させるreference_wrapper<T>ことができます。aはSTLコンテナに格納できます。
  • これは、非常に多くのセグメンテーション違反の原因である恐ろしいポインタ表記を回避するのに役立ちます。Tへのポインタを参照および可能な限りポインタに置き換えます(reference_wrapper<T>もちろん、ヒープに割り当てられたオブジェクトを削除するためにポインタを格納する必要がありますが、メモリ管理にはBoost Pointer Containersが非常に役立ちます)。T->f()T.f()

例:

class A
{
    //...
};

class B
{
 public:
   void setA(A& a) 
   {
     a_ = boost::ref(a); // use boost::cref if using/storing const A&
   }
   A& getA()
   {
      return a_;
   }
   B(A& a): a_(a) {}
private:
   boost::reference_wrapper<A> a_; 
};

int main()
{
   A a1;
   B b(a1);
   A a2;
   b.setA(a2);
   return 0;
}

ここでは、参照ラッパーのブースト実装を使用しましたが、C++0x標準にもそれがあります。http://aszt.inf.elte.hu/~gsd/halado_cpp/ch11.html#Bind-refも参照してください。

于 2009-06-18T08:05:43.933 に答える