使用static_cast铸造POD对象

Casting POD object with static_cast

本文关键字:POD 对象 铸造 cast static 使用      更新时间:2023-10-16

这就是我的意思,

class V3
{
public:
float x,y,z;
};
class V3_
{
 public:
float x,y,z;
};
V3_ vec1;
V3 vec2 = static_cast<V3_>(vec1);

我应该怎么做才能使这个强制转换在编译时工作?

谢谢。

编辑:

对我想做的事情似乎有些误解。我可以为转换编写一个运算符,但我希望它在编译时完成。

以下是Vector3的两个实现,它们允许static_cast。我不知道它是怎么工作的,但它确实工作。

http://www.ogre3d.org/docs/api/html/OgreVector3_8h_source.html

http://harry-3d-engine.googlecode.com/svn/trunk/NxOgreVec3.h

我能做这个铸造

 void DynamicBody::SetLinearMomentum(const Vector3& vel)
 {
body->setLinearMomentum(static_cast<NxOgre::Vec3>(vel));
 }

我想解释一下我该怎么做。

编辑:

经过进一步的调查,我发现它实际上是如何做到这一点的,它调用

template<class user_xyz_vector_type>
inline user_xyz_vector_type as() const { ... }

这不是一个实际的staticcast,但编译器接受它作为一个staticcast。我真的希望把吊舱互相铸造成一件真实的事情。

此强制转换在任何时候都不起作用。不能将完全不相关且不可转换的类型彼此static_cast

我不确定你想做什么,所以我不知道在这种情况下"工作"是什么意思,但在原始内存级别,转换可以由reinterpret_cast 执行

V3 vec2 = reinterpret_cast<V3_&>(vec1);

但这是一个丑陋的破解,不能保证工作,因为,再一次,你的类型是无关的。有了同样程度(甚至更好)的成功,你可以简单地将一个对象memcpy转换为另一个对象。

类型不相关,因此需要reinterpret_cast:

V3_ vec1;
V3 vec2 = reinterpret_cast<V3_&>(vec1);

您可以避免将强制转换完全用作:

V3 vec2 = {vec1.x, vec1.y, vec1.z};

或写入转换功能:

V3 to_V3(V3_ const & v)
{
   V3 v3 = {v.x, v.y, v.z};
   return v3;
}

并将其用作:

V3 vec2 = to_V3(vec1);
V3_ vec1;
V3 vec2 = *(V3*)&vec1;

编辑:但是,你知道这样做可能不是一件好事吗?

对于static_cast V3V3_,在V3类声明上使用public:。CCD_ 10。通过这种方式可以转换对象。如果你想要多态性并且知道自己在做什么,那么就使用虚拟解构器。