如何让我的对象重新解释为可转换为数组,比如std :: complex?

Cor*_*lks 7 c++ c++11

我刚才因为这个问题而学到了这个,标准是std::complex(26.4 [complex.numbers]):

4如果zcv 类型的左值表达式,std::complex<T>则:
- 表达式reinterpret_cast<cv T(&)[2]>(z)应格式良好,
- reinterpret_cast<cv T(&)[2]>(z)[0]应指定的实部z,并且
- reinterpret_cast<cv T(&)[2]>(z)[1]应指定虚部z.
此外,如果a是类型为cv 的表达式,std::complex<T>*并且表达式a[i]是为整数表达式定义的i,则:
- reinterpret_cast<cv T*>(a)[2*i]应指定的实部a[i],并且
- reinterpret_cast<cv T*>(a)[2*i + 1]应指定虚部a[i].

这是我真正想要以符合标准的方式利用的东西.有些时候我有POD,比如数学向量,它们由单一数据类型组成.这是两个示例类:

template <typename T, unsigned N>
struct Vector
{
    T v[N];
};

template <typename T>
struct Quaternion
{
    T r, i, j, k;
};
Run Code Online (Sandbox Code Playgroud)

根据我的理解,允许实现在最后一个成员之后以及成员之间添加填充.这意味着sizeof(Quaterntion<float>)可能不相等sizeof(float[4]),也sizeof(Vector<double, 8>)可能不相等sizeof(double[8]).这意味着我通常必须在static_assert代码中添加一些s,以确保我可以将我的Vector<float, N>/转换Quaterntion<float>为a float*,例如,而不用担心填充(例如,传递给C库或OpenGL缓冲区).

有没有通过,让我有相同的担保,我的小吊舱,像标准提供了一些方法VectorQuaternion作为std::complex呢?我知道特定于实现的事情,比如__attribute__((packed)).我正在寻找一种非实现特定的,符合标准的方法.由于标准需要支持这类提供的实现std::complex,我想知道是否还有一些标准方法将此保证应用于我自己的类.

dec*_*ype 2

我认为你在问不可能的事情。

请记住,标准库实现者通常依赖于非标准扩展或实现定义的行为。事实上,在 VC++ 的复杂头文件中我们发现:

#pragma pack(push, _CRT_PACKING)

// implementation

#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

您可以为四元数做的是将所有成员放入一个数组中,因为结构地址可以被reinterpret_cast 为指向第一个成员的指针。但我想这违背了结构的目的(通过名称直接访问成员)。

这不完全是你所要求的,但提供了一个

operator const T*() const // can be written in a portable manner
Run Code Online (Sandbox Code Playgroud)

对于你的结构,将允许你写

Quaternion<double> q = {};
const double * p = q;
Run Code Online (Sandbox Code Playgroud)

以额外的运行时/内存开销为代价,具体取决于您如何实现转换运算符。