在c++中扩展C结构
Extend C struct in C++
我有一些C结构,我想在c++中'扩展',以增加一些便利和类型安全。例如,假设我的结构体是
struct vector2D { float x, y; };
从许多来源,我已经收集到,在c++中扭曲这个结构最安全的方法是子类化它:
struct Vector2D: vector2D { ... };
到目前为止一切顺利。然而,我有什么困难弄清楚我如何重新解释C结构作为扩展版本。假设我有一个C函数
struct vector2D do_some_stuff(struct vector2D _a, struct vector2D _b) {
...
}
在这个函数中,我想使用c++表示。由于struct vector2D
和Vector2D
的布局是相同的,我认为简单的强制转换可以工作,例如
Vector2D a = static_cast<Vector2D>(_a)
,但这似乎不起作用。使用构造函数会生成可怕的样板代码。
如果可能的话,做这件事的正确方法是什么?澄清:do_some_stuff
是一个C函数,只打算从C代码中调用。
选择组合而不是继承。这是改变你的c++ class Vector2D
包含struct vector2D
的实例和接口:
class Vector2D {
vector2D p;
public:
vector2D& getP() { return p; }
vector2D const& getP() const { return p; }
float& x() { return p.x; }
float& y() { return p.y; }
float const& x() const { return p.x; }
float const& y() const { return p.y; }
// ...
};
然后调用C函数:
Vector2D v1;
Vector2D v2;
...
auto p = do_some_stuff(v1.getP(), v2.getP());
然而,我有什么困难弄清楚我如何重新解释C结构作为扩展版本。
嗯,继承不是这样工作的:你的子类是你的母类的专门化,所以你可以把Vector2D
解释为vector2d
,但不能反过来。
想想看:如果扩展的数据一开始就不存在,它应该从哪里来?
你能做的是实现一个构造函数或强制转换操作符,接受一个vector2d
来初始化一个新的Vector2D
。
除此之外,我想说你的整个努力都是有问题的,因为它是基于一个误解:你正在扩展的结构现在是一个c++类,不同于C类型。
经过一些实验,我找到了实现它的方法:
Vector2D v = *reinterpret_cast<Vector2D*>(&_v);
但是juanchopanza建议使用非成员函数可能是更好的方法。
相关文章:
- 如何使用静态变量,使用自定义Getter和设置器在SWIG中扩展结构
- 如何使用空的"null"或"空"元素扩展C++结构/类
- 结构化绑定中的const引用扩展了分解对象的寿命
- NUMA体系结构上大(8MB)内存区域的可扩展分配
- 扩展Windows API结构是安全的吗?
- 扩展typedef结构(与VC++11兼容)
- 在c++中初始化扩展结构
- 未记录的GCC扩展:结构中的VLA
- 我的火狐扩展程序不起作用。使用C++XPCOM组件的Firefox扩展(XPI文件)的结构是什么?
- 完成关键与扩展重叠结构
- 扩展树结构的序列化
- Cython 扩展类:如何在自动生成的 C 结构中公开方法
- 扩展类/结构C++数据成员的更好方法
- Python扩展模块包结构(命名空间)
- 使用从结构体扩展的符号
- 在c++中扩展C结构
- 在继承类中扩展结构
- 结构扩展结构的静态初始化
- 扩展向量迭代器以访问所包含类/结构的数据成员
- 复杂的数据结构,同时嵌入扩展 Python 与C++