gpt4 book ai didi

C++:将一种类型用作另一种类型

转载 作者:行者123 更新时间:2023-11-28 03:54:17 24 4
gpt4 key购买 nike

我正在为我的 C++ 项目使用 Chipmunk 物理引擎。

Chipmunk 有自己的 vector cpVect,它不过是一个 struct { double x, y; };

但是我的项目中有我自己的运算符重载 Vector 类 - 我想将它用作 cpVect,反之亦然,无需任何转换(我的 class Vector 的唯一数据字段也是 double x, y)

目前我将其用于隐式转换(用于参数传递、将 Vector 变量设置为 cpVect 等)

inline operator cpVect() { return cpv( x, y ); };
inline Vector( cpVect v ) : x( v.x ), y( v.y ) {}

这适用于大多数情况,但有一些问题 - 例如,它不兼容将 Vector 类型的数组与 cpVect 数组一起使用。

为此,我目前必须这样做:

Vector arrayA[123];
cpVect* arrayB = (cpVect*) arrayA;
  • 是否可以通过某种方式将我的 Vector 用作 cpVect,反之亦然?数据与两种结构相同,我的只是有额外的方法。

最佳答案

所以如果我理解你,你有这个:

class Foo
{
double x, y;
};

class Bar
{
double x, y;
};

...你想假装 Foo 实际上是 Bar,对吧?

你不能 - 不能不唤起 Undefined Behavior .无论你尝试什么,你都会掉进 UB 大黑洞。

  • 如果您尝试使用 union ,当您分配给 my_union.foo 并从 my_union.bar 读取时,您会调用 UB
  • 如果您尝试reinterpret_cast,您将在尝试使用转换指针时唤起 UB
  • 如果您尝试使用 C 风格的转换,您将遇到与上述相同的问题

问题是这样的:尽管 FooBar 看起来 相同,但它们并不相同 .就C++而言,它们是完全不同的类型,彼此完全没有关系。这是一件好事,但它也会引发一些看似人为和任意的障碍。

因此,为了在不引起 UB 的情况下执行此操作,您需要进行转换。您可以通过简单地向 Bar 添加一些工具(我认为这是您编写的,而不是库中的那个)来使这几乎是自动的:

class Bar
{
public:
Bar(const Foo& foo) : x(foo.x), y(foo.y) {}; // lets you convert from Foo to Bar
Bar& operator=(const Foo& foo) { x = foo.x; y = foo.y; return * this; }

operator Foo() const { Foo ret; ret.x = x; ret.y = y; return ret; } // lets you convert ffrom Bar to Foo
private:
double x, y;
};

它可以让你从 FooBar 然后再返回,只需要很少的代码或不需要代码。此外,编译器将在发布版本中优化很多。

关于C++:将一种类型用作另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4229521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com