[英]Casting POD object with static_cast
这就是我的意思,
class V3
{
public:
float x,y,z;
};
class V3_
{
public:
float x,y,z;
};
V3_ vec1;
V3 vec2 = static_cast<V3_>(vec1);
我应该怎么做才能使这个演员在编译时工作?
谢谢。
编辑:
似乎对我想做的事情有些误解。 我可以为转换编写一个运算符,但我希望它在编译时完成。
这是允许 static_cast 的 Vector3 的两个实现。 我不知道它是如何工作的,但它确实有效。
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 { ... }
这不是一个实际的 static_cast,但编译器将其作为一个接受。 我真的希望向彼此投射豆荚是一件真实的事情。
此演员表在任何时候都不起作用。 你不能static_cast
完全不相关且不能相互转换的类型。
我不确定你要做什么,所以我不知道在这种情况下工作“工作”是什么意思,但在原始内存级别,可以通过reinterpret_cast
执行转换
V3 vec2 = reinterpret_cast<V3_&>(vec1);
但这是一个丑陋的黑客,不能保证工作,因为,同样,你的类型是不相关的。 随着成功的程度相同(或更好),你可以简单memcpy
一个对象到另一个。
您可以完全避免使用强制转换,因为:
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);
类型不相关,因此您需要reinterpret_cast
:
V3_ vec1;
V3 vec2 = reinterpret_cast<V3_&>(vec1);
V3_ vec1;
V3 vec2 = *(V3*)&vec1;
编辑:仍然,你知道这可能不是一件好事吗?
将static_cast
V3
为V3_
使用public:
在V3
类声明上。 class V3 : public V3_
。 这样您就可以转换对象。 如果您想要多态性并且知道自己在做什么,请使用虚拟解构器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.