使用static_cast铸造POD对象
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);
我应该怎么做才能使这个强制转换在编译时工作?
谢谢。
编辑:
对我想做的事情似乎有些误解。我可以为转换编写一个运算符,但我希望它在编译时完成。
以下是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
V3
到V3_
,在V3
类声明上使用public:
。CCD_ 10。通过这种方式可以转换对象。如果你想要多态性并且知道自己在做什么,那么就使用虚拟解构器。
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- C++定义构造函数使对象成为非 POD
- 具有非 POD 对象的 GLib 异步队列
- 泛型运算符== 用于非 pod 对象
- 初始化新对象时C++默认构造函数和 POD 问题
- 通过指向其基的指针删除 POD 对象是否安全
- 为什么不能用memcpy复制非POD对象?
- 从数据成员(一次性嵌套类)中获取非 POD 对象的地址
- 使用static_cast铸造POD对象
- POD 类对象初始化是否需要构造函数
- 使用 memcpy 移动非 POD C++对象是否总是调用未定义行为
- C++不能传递非 POD 类型的对象
- 函数作用域的静态非 Pod 对象初始化
- 在共享库中全局声明的非pod对象的语义是什么?
- 从动态创建的数组构造pod对象时,是否推荐使用placement new ?
- 对于非pod对象,xvalue和右值在允许使用或行为方面的差异示例是什么?
- 为什么常量 POD 对象中的字段本身不是常量?
- 如何比较POD类型的对象
- C++标准是否允许对具有常量成员的 POD 对象进行零初始化
- 具有公共链接的非 POD 对象:应该发生什么?