Чем полезен tr1 :: reference_wrapper? - PullRequest
18 голосов
/ 11 октября 2008

недавно я читал превосходную книгу Скотта Мейерса Effective C ++ . В одном из последних советов он рассказал о некоторых возможностях TR1 - многие из них я знал с помощью Boost.

Однако был один, который я определенно НЕ распознал: tr1 :: reference_wrapper.

Как и когда я буду использовать tr1 :: reference_wrapper?

Ответы [ 2 ]

16 голосов
/ 11 октября 2008

Насколько я знаю, это похоже на boost :: ref. В основном, ссылка, которую можно скопировать. Очень полезно при привязке к функциям, где вам нужно передать параметры по ссылке.

Например (с использованием синтаксиса boost):

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

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

fIncrementMyVariable();

Эта статья доктора Доббса содержит некоторую информацию.

Надеюсь, что это правильно и полезно. :)

11 голосов
/ 18 июня 2009

reference_wrapper<T> - чрезвычайно полезная и простая библиотека. Внутренне reference_wrapper<T> хранит указатель на T. Но интерфейс, который он предоставляет, не содержит никакой записи указателя.

  • Это позволяет ссылке вести себя как другие простые объекты - reference_wrapper<T> может храниться в контейнере STL.
  • Это помогает избежать ужасной нотации указателя - причины такого большого количества ошибок сегментации. Замените указатель на T на reference_wrapper<T>, указатели на ссылки и T->f() на T.f() везде, где это возможно (указатели конечно должны быть сохранены для удаления объектов, выделенных в куче, но для управления памятью контейнеры Boost Pointer весьма полезны) .

Пример:

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

...