c++ 将Vector3D结构传递到基于指针的API

gzjq41n4  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(102)

我正在使用VTK,它的API要求所有调用都使用double*double[3]调用。因此,这些方法接受指向3D空间中某个点的指针。
我已经创建了Vector3D结构体,这是一个简单的聚合:

struct Vector3D
{
    double x;
    double y;
    double z;
};

字符串
现在我想将它用于VTK API,因为VTK本身没有Point3D/Vector3D结构,使用原始指针很奇怪。因此,我使用了以下方法:

double* ptr() noexcept
{
    // I'm not totally sure, maybe it'd be better to use `reinterpret_cast<...>(&x)` here
    return reinterpret_cast<double*>(this);
}


这样就可以了,但是现在我意识到我还需要const重载。

const double* ptr() const noexcept
{
    return reinterpret_cast<const double*>(this);
}


但是我没有看到任何使用reinterpret_cast<const T*>的情况。这让我想到“我做得对吗?“

wixjitnu

wixjitnu1#

是的,这很好。如果你想更加小心的话,你可以添加static_assert(sizeof(Vector3D) == sizeof(double) * 3);,但是它可能永远不会被触发。
从形式上讲,如果您试图通过此指针访问除x之外的任何成员,则行为未定义,因为+/-/[i](具有非零偏移量)只能用于通过指向不同元素的指针访问数组的元素,并且您没有数组。
然而,在实践中,使用指针的代码可能隐藏在不同的翻译单元(可能是库)中,从而防止编译器注意到UB并能够基于其进行优化。即使在相同的翻译单元中使用,编译器也不太可能破坏这样的代码。

相关问题