Ann*_*inn 9 c++ pointers casting
假设我有两个不同的类,它们以相同的内部方式表示2D坐标数据,如下所示:
class LibA_Vertex{
public:
// ... constructors and various methods, operator overloads
float x, y
};
class LibB_Vertex{
public:
// ... same usage and internal data as LibA, but with different methods
float x, y
};
void foobar(){
LibA_Vertex * verticesA = new LibA_Vertex[1000];
verticesA[50].y = 9;
LibB_Vertex * verticesB = reinterpret_cast<LibB_Vertex*>( vertexA );
print(verticesB[50].y); // should output a "9"
};
Run Code Online (Sandbox Code Playgroud)
鉴于两个类是相同的并且上面的函数,我可以可靠地指望这个指针转换在每种情况下按预期工作吗?
(背景是,我需要一种简单的方法来交换具有相同Vertex类的两个独立库之间的顶点数组,我想避免不必要地复制数组).
Ben*_*igt 13
C++ 11增加了一个名为layout-compatible的概念,适用于此处.
两个标准布局结构(第9)的类型是布局兼容如果它们具有相同数量的非静态数据成员和相应的非静态数据成员(在声明顺序)的具有布局兼容的类型(3.9).
哪里
标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),也没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类,
- 或者在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类.
甲标准布局结构是一个标准布局类与所定义的类键
struct或类键class.甲标准布局联盟是一个标准布局类与所定义的类键
union.
最后
符合cv资格和cv不合格版本(3.9.3)的布局兼容类型的指针应具有相同的值表示和对齐要求(3.11).
哪种保证reinterpret_cast可以将指向一种类型的指针转换为指向任何布局兼容类型的指针.
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |