编写一个引用类型函数,用作L值来处理其R值

时间:2013-06-06 08:56:16

标签: c++ function lvalue

我注意到网络和书籍中参考类型函数的示例代码都只有一个返回行(如下所示,来自MSDN)

class Point
{
public:
  unsigned& x();
private:
  unsigned obj_x;
};

unsigned& Point :: x()
{
  return obj_x;
}

int main()
{
  Point ThePoint;
  ThePoint.x() = 7;
}

我认为如果我在引用类型函数中包含更多行(算术表达式,控制结构等),它们只会在用作普通(R值)函数时改变其行为。但是我怎么能写一个函数,当它用作L值时,会对它的R值(这里是数字7)进行一些算术运算,或者在将它放入return变量之前对它进行检查(这里是{{ 1}})?

1 个答案:

答案 0 :(得分:2)

你的意思是非常 conterintuitive。但这不可能达到这个目的。

您想要的是在代理对象的帮助下完成的常规操作,就像在std::vector<bool>专业化中完成一样。当您像v[i] = true;一样使用它时,v[i]会返回代理对象,它会重载赋值运算符,它会在内部位串中上升ith位。

示例:

struct A
{
   struct proxy
   {
      proxy(int * x)
         : x_(x)
      {       
      }

      proxy & operator = (int v)
      {
         *x_ = v + 2;
         return *this;
      }

      operator int() const
      {
         return *x_;
      }
    private:
      int * x_;
   };

   proxy x_add_2()
   {
      return proxy(&x_);
   }

   int x() const
   {
      return x_;
   }
private:
   int x_;
};

int main(int argc, char* argv[])
{
   A a;
   a.x_add_2() = 2;
   std::cout << a.x() << std::endl;
   return 0;
}