我为具有多个属性名称的2D矢量定义了以下联合模板:
template<T> union vec2
{
struct {
T x;
T y;
};
struct {
T u;
T v;
};
struct {
T i;
T j;
};
struct {
T width;
T height;
};
template<ST> vec2(vec2<ST> other) : x(other.x), y(other.y);
vec2() : x(0), y(0);
vec2(T v1, T v2) : x(v1), y(v2);
}
虽然我认为在ABI之间传递并导致错误是安全的,因为:
所有成员都是相同的类型,因此struts将被打包而不需要任何额外的填充。
构造函数是内联的,只需设置第一个结构的属性。
所以联盟应算作POD
预期用途,
模板位于包含主应用程序和外部库(可能使用不同编译器编译)的标头中
说我从外部库中有以下类型的函数指针
typedef void* (__fastcall *createWindow)(vec2<uint16_t>, char* title);
我的理解是打电话
void* window = createWindow(vec2<uint16_t>(320,240), "Test Window");
将是完全安全的,因为vec2只是两个16位整数打包成一个包含值(320,240)的32位整数,并且随着库被编译为同一平台即32位窗口,它们将存储此数据完全相同(因为结构不应该有填充),因此我动态加载createWindow的库可以使用任何属性对访问值,即width = 320,height = 240。
我的推理是否正确,如果没有办法让这个安全地工作,请注意我需要模板,以便从vec2转换为vec2。