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