使用static_cast转换POD对象

时间:2012-07-09 18:47:14

标签: c++ casting pod

这就是我的意思,

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,但编译器将其作为一个接受。 我真的希望铸造吊舱彼此是一个真实的东西。

5 个答案:

答案 0 :(得分:4)

此演员阵容随时无效。你不能static_cast完全不相关,也不能互相转换。

我不确定你要做什么,所以我不知道在这种情况下“工作”意味着什么,但在原始内存级别,转换可以由reinterpret_cast <执行/ p>

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

但这是一个丑陋的黑客,不能保证工作,因为,你的类型是无关的。在成功程度相同(甚至更好)的情况下,您可以简单地memcpy将一个对象转换为另一个对象。

答案 1 :(得分:1)

你可以完全避免使用强制转换:

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);

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

V3_ vec1;
V3 vec2 = *(V3*)&vec1;
编辑:你知道这可能不是一件好事吗?

答案 4 :(得分:0)

static_cast V3V3_ public:课程申请V3class V3 : public V3_。这样你就可以转换对象了。如果你想要多态性并且你知道你正在做什么,请使用虚拟解构器。