Недавно я прочитал превосходную книгу Скотта Мейерса Эффективный C++. В одном из последних советов он рассказал о некоторых функциях TR1 - я знал многие из них через Boost.
Однако был один, который я точно НЕ узнал: tr1 :: reference_wrapper.
Как и когда мне использовать tr1 :: reference_wrapper?





Насколько я знаю, это похоже на boost :: ref. В основном это ссылка, которую можно скопировать. Очень полезно при привязке к функциям, где вам нужно передать параметры по ссылке.
Например (с использованием синтаксиса повышения):
void Increment( int& iValue )
{
iValue++;
}
int iVariable = 0;
boost::function< void () > fIncrementMyVariable = boost::bind( &Increment, boost::ref( iVariable ));
fIncrementMyVariable();
Эта статья доктора Доббса имеет некоторую информацию.
Надеюсь, это правильно и полезно. :)
@ceretullis ref - это метод конструктора для создания объекта reference_wrapper <T>, где T - это тип.
с С ++ 11, я бы предпочел использовать лямбда: auto fIncrement = [&iVariable]{ Increment(iVariable);};
reference_wrapper<T> - чрезвычайно полезная и простая библиотека. Внутри reference_wrapper<T> хранится указатель на T. Но интерфейс, который он предоставляет, не содержит нотации указателя.
reference_wrapper<T> может храниться в контейнере STL.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
«Старый» синтаксис: [A * a_; по сравнению с boost :: reference_wrapper <A> a_;] и [a_ = & a; по сравнению с a_ = boost :: ref (a);] [return * a_; по сравнению с возвратом a_;] и [B (A & a): a_ (a) {} по сравнению с B (A & a): a _ (& a) {}]
Хорошо. Я знаком с boost :: ref ... Я просто не понимал, что TR1 назвал эту функцию как-то иначе, то есть не tr1 :: ref.