Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ tr1::reference\u包装器如何有用?_C++_Stl_Boost_Tr1 - Fatal编程技术网

C++ tr1::reference\u包装器如何有用?

C++ tr1::reference\u包装器如何有用?,c++,stl,boost,tr1,C++,Stl,Boost,Tr1,最近我一直在读斯科特·迈尔斯的优秀著作。在最后的一个技巧中,他介绍了TR1的一些特性——我通过Boost了解了其中的许多特性 然而,有一个我肯定不认识:tr1::reference\u wrapper 如何以及何时使用tr1::reference\u包装器?据我所知,它就像boost::ref一样。基本上,可以复制的引用。在绑定到需要通过引用传递参数的函数时非常有用 例如(使用boost语法): void增量(int&iValue) { iValue++; } int变量=0; boost::f

最近我一直在读斯科特·迈尔斯的优秀著作。在最后的一个技巧中,他介绍了TR1的一些特性——我通过Boost了解了其中的许多特性

然而,有一个我肯定不认识:tr1::reference\u wrapper


如何以及何时使用tr1::reference\u包装器?

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

例如(使用boost语法):

void增量(int&iValue)
{
iValue++;
}
int变量=0;
boost::functionfIncrementMyVariable=boost::bind(&Increment,boost::ref(ivvariable));
fIncrementMyVariable();
他有一些信息

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

reference\u wrapper
是一个非常有用且简单的库。在内部,
reference\u包装器
存储指向T的指针。但它公开的接口不包含任何指针表示法

  • 它允许引用的行为类似于其他简单对象-一个
    reference\u包装器
    可以存储在STL容器中
  • 它有助于避免可怕的指针表示法——这是造成如此多分段错误的原因。尽可能用
    reference\u wrapper
    替换指向T的指针,用引用替换指针,用
    T.f()
    替换
    T.f()
    替换指针(当然,删除堆分配的对象需要存储指针,但对于内存管理,Boost指针容器非常有用)
例如:

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;
}
A类
{
//...
};
B类
{
公众:
无效setA(A&A)
{
a=boost::ref(a);//如果使用/存储常量a,则使用boost::cref&
}
A&getA()
{
返回一个字母;
}
B(A&A):A(A){}
私人:

boost::reference_wrapper

好的,很酷。我熟悉boost::ref…我只是没有意识到TR1将此功能称为不同的功能-即,不是TR1::ref。@ceretulis ref是生成引用_wrapper对象的构造函数方法,其中t是一个类型。对于C++11,我想我更喜欢使用lambda:
自动查找=[&ivvariable]{Increment(ivvariable);};
旧的语法是:[A*A_u;与boost::reference_u包装器A_;]相比,[A_=&A;与A_=boost::ref(A);][return*A_u;与return A_;]
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;
}