-1

这就是我的意思

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,但编译器接受它作为一个。我真的希望互相投豆荚是一件真实的事情。

4

5 回答 5

4

这个演员表在任何时候都不会起作用。您不能static_cast完全不相关且不可相互转换的类型。

我不确定你要做什么,所以我不知道在这种情况下工作“工作”是什么意思,但在原始内存级别,转换可以通过reinterpret_cast

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

但这是一个丑陋的 hack,不能保证有效,因为您的类型再次无关。以相同程度(甚至更好)的成功,您可以简单地将memcpy一个对象变成另一个对象。

于 2012-07-09T18:49:45.683 回答
1

这些类型是不相关的,因此您需要reinterpret_cast

V3_ vec1;
V3 vec2 = reinterpret_cast<V3_&>(vec1);
于 2012-07-09T18:53:24.013 回答
1

您可以完全避免使用 cast 作为:

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);
于 2012-07-09T18:51:08.237 回答
0

static_cast V3用于V3_类声明 public:。_ . 这样您就可以转换对象。如果您想要多态性并且知道自己在做什么,请使用虚拟解构器。V3class V3 : public V3_

于 2012-07-09T18:57:21.917 回答
0
V3_ vec1;
V3 vec2 = *(V3*)&vec1;

编辑:仍然,你知道这可能不是一件好事吗?

于 2012-07-09T18:50:47.233 回答