在c++中扩展C结构

Extend C struct in C++

本文关键字:结构 扩展 c++      更新时间:2023-10-16

我有一些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 vector2DVector2D的布局是相同的,我认为简单的强制转换可以工作,例如

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建议使用非成员函数可能是更好的方法。