这就是我的意思是铸造POD对象,使用的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,但编译器接受它作为一个。 我真的很希望将pod转换为彼此是一件实际的事情。
'memcpy'更好,甚至。如果'V3'和'V3_'具有相同的布局,并且通常对于给定的编译器来说是相同的,那么它就可以保证工作,没有理由将它们放在不同的位置。使用'reinterpret_cast',你可以控制优化器是否利用严格的别名规则:你可以很容易地得到在-O1下工作的代码,并在'-O3'上失败,这取决于vec1何时何地'被初始化。然后reinterpret_cast – 2012-07-09 18:58:42
。 – mikbal 2012-07-09 19:32:14
@mikbal:'reinterpret_cast'可能很容易因为Steve Jessop的评论中描述的原因而失败。 – AnT 2012-07-09 19:54:51