【问题标题】:How is tr1::reference_wrapper useful?tr1::reference_wrapper 有什么用?
【发布时间】:2010-09-16 15:51:33
【问题描述】:

最近我一直在阅读 Scott Meyers 的优秀 Effective C++ 书籍。在最后一个技巧中,他介绍了 TR1 的一些功能——我通过 Boost 了解了其中的许多功能。

但是,有一个我绝对不认识:tr1::reference_wrapper。

我将如何以及何时使用 tr1::reference_wrapper?

【问题讨论】:

    标签: c++ stl boost tr1


    【解决方案1】:

    据我所知,这就像 boost::ref。基本上,可以复制的参考。在绑定到需要通过引用传递参数的函数时非常有用。

    例如(使用 boost 语法):

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

    This Dr. Dobbs article 有一些信息。

    希望这是正确的,并且有帮助。 :)

    【讨论】:

    • 好的,很酷。我对 boost::ref 很熟悉...我只是没有意识到 TR1 将此功能称为不同的东西 - 即,不是 tr1::ref。
    • @ceretullis ref 是生成 reference_wrapper 对象的构造方法,其中 T 是一个类型。
    • 对于 C++11,我想我更喜欢使用 lambda:auto fIncrement = [&amp;iVariable]{ Increment(iVariable);};
    【解决方案2】:

    reference_wrapper&lt;T&gt; 是一个非常有用且简单的库。 reference_wrapper&lt;T&gt; 在内部存储一个指向 T 的指针。但它公开的接口不包含任何指针表示法。

    • 它允许引用的行为与其他简单对象一样 - reference_wrapper&lt;T&gt; 可以存储在 STL 容器中。
    • 它有助于避免可怕的指针符号 - 导致如此多的分段错误。尽可能将指向 T 的指针替换为 reference_wrapper&lt;T&gt;、引用指针和 T-&gt;f() T.f()(当然需要存储指针以删除堆分配的对象,但对于内存管理,Boost Pointer Containers 非常有用) .

    例子:

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

    这里我使用了引用包装器的 boost 实现,但 C++0x 标准也将拥有它。另见http://aszt.inf.elte.hu/~gsd/halado_cpp/ch11.html#Bind-ref

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多