如何为LValue和RValue编写不同的运算符[]
How do I write different operator[] for LValue and RValue?
我正在尝试将一个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);
现在最好通过操作员[]重载来包装get
和set
操作
double& operator[](int index);
const double& operator[](int index) const;
但是,我如何告诉运算符[]在vec[index]=3
和double value=vec[3]
之间有不同的行为?对于先前的CCD_ 6应当被调用,而对于后一个CCD_。
我不会试图将一个接口封装到另一个接口中。
话虽如此,如果您真的想这样做,一个可能的解决方案是创建一个代理对象,并让operator[]
返回该代理对象。代理对象将转换为用于读取的底层类型const double&
,以及用于写入的重载operator=
。它们中的每一个都将调用相应的库函数。
这将允许看起来类似C++std::vector
:MyVector v(...); v[1] = 10.1; double d = v[1];
的语法,但会有问题。代理对象不能在所有上下文中替换真实类型,只能在其中一些上下文中替换。即使在那里,语义也是不同的,所以虽然它看起来像一个正则向量,但有一天你会试图以它不支持的方式使用代理,你会对泄漏的抽象
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载运算符 [] 并且没有收到"lvalue required as left operand of assignment"错误
- C 过载()运算符,LVALUE和RVALUE
- 为什么通过运算符的地址获得的指针不是lvalue
- 如何为LValue和RValue编写不同的运算符[]