1

我正在尝试将 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[] 重载包装getand操作set

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

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

4

1 回答 1

2

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

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

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

于 2013-08-14T22:28:44.200 回答