0

我注意到网络和书籍中引用类型函数的示例代码都只有一个返回行(如下来自 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)进行一些算术运算或根据某些条件检查它,然后将其放入返回变量(此处obj_x)?

4

1 回答 1

2

你的意思是非常直观的。但这无法以这种方式实现。

您想要的是在代理对象的帮助下完成的普通工作,就像在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;
}
于 2013-06-06T09:21:35.200 回答