How is tr1::reference_wrapper useful?

前端 未结 2 1016
闹比i
闹比i 2020-12-03 07:38

recently I\'ve been reading through Scott Meyers\'s excellent Effective C++ book. In one of the last tips he covered some of the features from TR1 - I knew many of them via

相关标签:
2条回答
  • 2020-12-03 07:45

    It's like boost::ref, as far as I know. Basically, a reference which can be copied. Very useful when binding to functions where you need to pass parameters by reference.

    For example (using boost syntax):

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

    This Dr. Dobbs article has some info.

    Hope this is right, and helpful. :)

    0 讨论(0)
  • 2020-12-03 07:45

    reference_wrapper<T> is an immensely useful and simple library. Internally the reference_wrapper<T> stores a pointer to T. But the interface it exposes does not contain any pointer notation.

    • It allows the reference to behave like other simple objects - a reference_wrapper<T> can be stored in a STL container.
    • It helps avoid the dreadful pointer notation - the cause of so many segmentation faults. Replace a pointer to T with a reference_wrapper<T>, pointers by references and T->f() by T.f() wherever possible (ofcourse pointers need to be stored for deleting a heap-allocated objects, but for memory management Boost Pointer Containers are quite useful).

    Example:

    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;
    }
    

    Here I have used the boost implementation of reference wrapper, but C++0x standard is going to have it too. See also http://aszt.inf.elte.hu/~gsd/halado_cpp/ch11.html#Bind-ref

    0 讨论(0)
提交回复
热议问题