我正在尝试将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操作封装为operator[]重载。
double& operator[](int index);
const double& operator[](int index) const;但我如何告诉operator[]有不同的行为,在vec[index]=3和double value=vec[3]之间?对于前面的vector_set_value,应该调用vector_get_value,而对于后者,应该调用vector_get_value。
发布于 2013-08-14 22:28:44
我不会尝试将一个接口封装到另一个接口中。
尽管如此,如果您真的想这样做,一个可能的解决方案是创建一个代理对象,并让您的operator[]返回该代理对象。代理对象将转换为底层类型const double&进行读取,重载operator=用于写入。它们中的每一个都将调用适当的库函数。
这将允许使用类似于C++ std::vector:MyVector v(...); v[1] = 10.1; double d = v[1];的语法,但是会有问题。代理对象不能在所有上下文中替换真实类型,仅在其中一些上下文中。即使在那里,语义也是不同的,因此,虽然它看起来像一个规则向量,但是有一天,您将尝试以它不支持的方式使用代理,您将对http://www.joelonsoftware.com/articles/LeakyAbstractions.html感到困惑。
https://stackoverflow.com/questions/18241676
复制相似问题