我正在尝试将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
应该被调用。
答案 0 :(得分:2)
我不会尝试将一个界面包装到另一个界面中。
话虽如此,如果你真的想这样做,一个可能的解决方案是创建一个代理对象,并让你的operator[]
返回该代理对象。代理对象可以转换为基础类型const double&
以进行读取,并且重载operator=
以进行写入。他们每个人都会调用相应的库函数。
这将允许看起来的语法类似于C ++ std::vector
:MyVector v(...); v[1] = 10.1; double d = v[1];
的语法,但 会有问题。代理对象不能替换所有上下文中的实际类型,只能替换其中的一些。即使在那里,语义也是不同的,所以虽然它可能看起来像一个常规向量,但有一天你会尝试以一种它不支持的方式使用代理,你会对 leaking abstraction感到困惑。