c++ - ¿Cómo es tr1:: reference_wrapper útil?
stl boost (2)
reference_wrapper<T>
es una biblioteca inmensamente útil y simple. Internamente, la reference_wrapper<T>
almacena un puntero a T. Pero la interfaz que expone no contiene ninguna notación de puntero.
- Permite que la referencia se comporte como otros objetos simples: una
reference_wrapper<T>
se puede almacenar en un contenedor STL. - Ayuda a evitar la notación de puntero terrible - la causa de tantas fallas de segmentación. Reemplace un puntero a T con un
reference_wrapper<T>
, punteros por referencias yT->f()
porTf()
siempre que sea posible (por supuesto, los punteros deben almacenarse para eliminar un objeto asignado en el montón, pero para la administración de memoria Boost Pointer Containers son bastante útiles).
Ejemplo:
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;
}
Aquí he usado la implementación de impulso del wrapper de referencia, pero el estándar C ++ 0x también lo tendrá. Ver también http://aszt.inf.elte.hu/~gsd/halado_cpp/ch11.html#Bind-ref
Recientemente, he estado leyendo el excelente libro Effective C ++ de Scott Meyers. En uno de los últimos consejos, él cubrió algunas de las características de TR1: conocía muchas de ellas a través de Boost.
Sin embargo, hubo uno que definitivamente NO reconocí: tr1 :: reference_wrapper.
¿Cómo y cuándo usaría tr1 :: reference_wrapper?
Es como boost :: ref, hasta donde yo sé. Básicamente, una referencia que puede ser copiada. Muy útil cuando se vincula a funciones donde necesita pasar parámetros por referencia.
Por ejemplo (usando la sintaxis boost):
void Increment( int& iValue )
{
iValue++;
}
int iVariable = 0;
boost::function< void () > fIncrementMyVariable = boost::bind( &Increment, boost::ref( iVariable ));
fIncrementMyVariable();
Este artículo del Dr. Dobbs tiene algo de información.
Espero que esto sea correcto y útil. :)