これは危険だと思います。私の特定のケースでは、サードパーティのライブラリを使用しているため、選択の余地はありません。
構造体サイズのコンパイル時チェックを追加できます。
ライブデモ
struct Vec2
{
float a;
float b;
};
int main()
{
int assert_s[ sizeof(Vec2) == 2*sizeof(float) ? 1 : -1 ];
}
それはあなたのアプローチの自信を高めるでしょう(前述のように、reinterpret_castのためにまだ安全ではありません)。
raw = reinterpret_cast(&(myArray [0]));
ISO C ++ 98 9.2 / 17:
reinterpret_castを使用して適切に変換されたPOD構造体オブジェクトへのポインターは、その初期メンバー(または、そのメンバーがビットフィールドの場合は、それが存在するユニット)を指し、その逆も同様です。[注:したがって、適切な配置を実現するために必要な場合、標準レイアウトの構造体オブジェクト内に名前のないパディングが存在する可能性がありますが、最初は存在しません。—エンドノート]
そして最後に、対応するアドレスの実行時チェックにより、そのようなソリューションはかなり安全になります。これは、単体テスト中、またはプログラムのすべての開始時(小さなテストアレイ上)で実行できます。
すべてを一緒に入れて:
ライブデモ
#include <vector>
#include <cassert>
using namespace std;
struct Vec2
{
float a;
float b;
};
int main()
{
int assert_s[ sizeof(Vec2) == 2*sizeof(float) ? 1 : -1 ];
typedef vector<Vec2> Vector;
Vector v(32);
float *first=static_cast<float*>(static_cast<void*>(&v[0]));
for(Vector::size_type i,size=v.size();i!=size;++i)
{
assert((first+i*2) == (&(v[i].a)));
assert((first+i*2+1) == (&(v[i].b)));
}
assert(false != false);
}