我刚刚学到这个是因为这个问题 https://stackoverflow.com/q/22919357,该标准规定std::complex
(26.4 [复数]):
4 If z
是类型的左值表达式cv std::complex<T>
then:
- 表达方式reinterpret_cast<cv T(&)[2]>(z)
应结构良好,
— reinterpret_cast<cv T(&)[2]>(z)[0]
应指定实部z
, and
— reinterpret_cast<cv T(&)[2]>(z)[1]
应指定的虚部z
.
此外,如果a
是类型的表达式cv std::complex<T>*
和表达a[i]
对于整数表达式来说是明确定义的i
, then:
— reinterpret_cast<cv T*>(a)[2*i]
应指定实部a[i]
, and
— 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;
};
据我了解,实现允许在最后一个成员之后以及成员之间添加填充。意思就是sizeof(Quaterntion<float>)
可能不等于sizeof(float[4])
, and sizeof(Vector<double, 8>)
可能不等于sizeof(double[8])
。这意味着我通常必须添加一些static_assert
到我的代码以确保我可以投射我的Vector<float, N>
/Quaterntion<float>
to a float*
例如,不必担心填充(例如,用于传递到 C 库或 OpenGL 缓冲区)。
标准是否提供了某种方法,可以让我为我的小 POD 提供相同的保证,例如Vector
and Quaternion
, as std::complex
做?我知道特定于实施的事情,例如__attribute__((packed))
。我正在寻找一种非特定于实现的、符合标准的方法来执行此操作。由于该标准需要对此类事物的支持,以实现提供std::complex
,我想知道是否还有一些标准方法可以将此保证应用于我自己的课程。