如何为LValue和RValue编写不同的运算符[]

How do I write different operator[] for LValue and RValue?

本文关键字:运算符 LValue RValue      更新时间:2023-10-16

我正在尝试将一个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);

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

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

但是,我如何告诉运算符[]在vec[index]=3double value=vec[3]之间有不同的行为?对于先前的CCD_ 6应当被调用,而对于后一个CCD_。

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

话虽如此,如果您真的想这样做,一个可能的解决方案是创建一个代理对象,并让operator[]返回该代理对象。代理对象将转换为用于读取的底层类型const double&,以及用于写入的重载operator=。它们中的每一个都将调用相应的库函数。

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

感到困惑