Использовать союз?
union vertex
{
struct { float x, y, z; };
struct { float r, g, b; };
float arr[3];
};
Я бы не советовал - это приведет к путанице.
Добавлена
Как отметил Адриан в своем ответе, этот союз с анонимными членами структуры не поддерживается ISO C ++. Он работает в GNU G ++ (с жалобами на то, что он не поддерживается при включении '-Wall -ansi -pedantic
'). Это напоминает предварительно стандартные дни C (pre-K & R 1st Edn), когда имена элементов структуры должны были быть уникальными во всех структурах, и вы могли использовать сокращенные обозначения, чтобы получить смещение внутри структуры, и вы могли использовать имена членов из других типов структуры - форма анархии. К тому времени, когда я начал использовать C (давным-давно, но после K & R1), это уже историческое использование.
Обозначения, показанные с анонимными членами объединения (для двух структур), поддерживаются C11 (ISO / IEC 9899: 2011), но не более ранними версиями стандарта C. Раздел 9.5 ИСО / МЭК 14882: 2011 (C ++ 11) предусматривает анонимные объединения, но GNU g++
(4.9.1) не принимает код, показанный с помощью -pedantic
, идентифицирующий "warning: ISO C++ prohibits anonymous structs [-Wpedantic]
".
Поскольку идея приведет к путанице, меня не особо беспокоит, что она не стандартная; Я бы не стал использовать механизм для этой задачи (и я бы опасался использовать анонимные структуры в объединении, даже если это было бы полезно).
Была высказана озабоченность:
Три (x-y-z, r-g-b и массив) не обязательно совпадают.
Это союз из трех элементов; три элемента начинаются с одного адреса. Первые два являются структурами, содержащими 3 значения с плавающей точкой. Нет наследования и нет виртуальных функций для предоставления разных макетов и т. Д. Структуры будут выложены из трех смежных элементов (на практике, даже если стандарт допускает заполнение). Массив также начинается с того же адреса, и при условии отсутствия заполнения в структурах элементы перекрывают две структуры. Я действительно не вижу в этом проблемы.