【问题标题】:How do I write different operator[] for LValue and RValue?如何为 LValue 和 RValue 编写不同的 operator[]?
【发布时间】:2013-08-14 20:28:53
【问题描述】:

我正在尝试将 C 库连接到我的 C++ 项目。该库有自己的向量类型,假设为VECTOR,并提供元素访问:

int vector_set_value(VECTOR* vec, int index, double new_value);
int vector_get_value(VECTOR* vec, int index, double* retrieved_value);

现在最好通过 operator[] 重载包装 getset 操作

double& operator[](int index);
const double& operator[](int index) const;

但是我如何告诉 operator[] 在vec[index]=3double value=vec[3] 之间有不同的行为?前面的vector_set_value 应该被调用,而后面的vector_get_value 应该被调用。

【问题讨论】:

  • 我知道Ruby中有def []def []=,C++中有没有类似的策略?
  • 使用const double& operator[](int index) const ?
  • 看看signatures for std::vector's operator[]
  • 看看这个query

标签: c++ operator-keyword lvalue rvalue


【解决方案1】:

我不会尝试将一个接口封装到另一个接口中。

话虽如此,如果您真的想这样做,一种可能的解决方案是创建一个代理对象,并让您的 operator[] 返回该代理对象。代理对象将转换为基础类型const double& 以进行读取,并重载operator= 以进行写入。他们每个人都会调用适当的库函数。

这将允许看起来类似于 C++ std::vector: MyVector v(...); v[1] = 10.1; double d = v[1]; 的语法,但它有问题。代理对象不能在所有上下文中替换真实类型,只能在其中一些上下文中替换。即使在那里,语义也是不同的,所以虽然它可能看起来像一个常规向量,但有一天你会尝试以它不支持的方式使用代理,你会在 leaking abstraction em>

【讨论】:

  • 尤其是,您不能将vec[3] 传递给需要double & 参数的函数,因为根本问题是getter-setter 接口与引用不兼容。跨度>
  • 我也意识到了这一点,因为我无法使用那个愚蠢的接口获取double 变量的地址。无论如何,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多