如何为LValue和RValue编写不同的operator []?

时间:2013-08-14 20:28:53

标签: c++ operator-keyword lvalue 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);

现在最好通过operator []重载{/ 1}}和get操作重载

set

但是如何告诉operator []在double& operator[](int index); const double& operator[](int index) const; vec[index]=3之间有不同的行为?对于之前的double value=vec[3]应该被调用,而后者vector_set_value应该被调用。

1 个答案:

答案 0 :(得分:2)

我不会尝试将一个界面包装到另一个界面中。

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

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