ユニオンを使用しますか?
union vertex
{
struct { float x, y, z; };
struct { float r, g, b; };
float arr[3];
};
私はそれをお勧めしません - それは混乱につながります.
追加:
エイドリアンが回答で指摘したように、匿名の構造体メンバーとのこの結合は、ISO C++ ではサポートされていません。これは GNU G++ で動作します (「 」をオンにするとサポートされないという不満があります-Wall -ansi -pedantic
)。これは、構造体の要素名がすべての構造体で一意である必要があり、構造内のオフセットを取得するために短縮表記法を使用できた、標準化以前の C 時代 (K&R 1st Edn 以前) を思い起こさせます。他の構造タイプのメンバー名を使用する - 無秩序の形。私が C を使い始めた頃には (かなり前ですが、K&R1 以降)、それはすでに歴史的な使用法でした。
(2 つの構造体の) 匿名共用体メンバーで示された表記法は、C11 (ISO/IEC 9899:2011) でサポートされていますが、C 標準の以前のバージョンではサポートされていません。ISO/IEC 14882:2011 (C++11) のセクション 9.5 は無名共用体を規定していますが、GNU (4.9.1) は" " を識別するg++
で示されるコードを受け入れません。-pedantic
warning: ISO C++ prohibits anonymous structs [-Wpedantic]
この考え方は混乱を招くので、それが標準的でないことは特に心配していません。私はこのタスクにこのメカニズムを使用しません (また、匿名の構造体を共用体で使用することには、たとえそれが有益であったとしても) 慎重です)。
懸念が提起されました:
3 つ (xyz、rgb、および配列) は、必ずしも整列しているわけではありません。
それは 3 つの要素の結合です。3 つの要素は同じアドレスから始まります。最初の 2 つは、3 つの float 値を含む構造体です。継承はなく、さまざまなレイアウトなどを提供する仮想関数もありません。構造は、3 つの要素が連続して配置されます (実際には、標準でパディングが許可されていても)。配列も同じアドレスから開始し、構造体で「パディングなし」を条件として、要素は 2 つの構造体をオーバーラップします。問題があるとは本当に思いません。