У меня есть целочисленные значения, которые используются для доступа к данным в несвязанных хранилищах данных, то есть к дескрипторам. Я решил обернуть целые числа в структуре, чтобы иметь строго типизированные объекты, чтобы разные целые числа не могли быть перемешаны. Они, и должны быть, POD. Это то, что я использую:Имеет ли доступ к массиву структуры POD как массив своего единственного члена, нарушает строгий псевдоним?
struct Mesh {
int handle;
};
struct Texture {
int handle;
};
У меня есть массивы этих ручек, таких как: Texture* textureHandles;
.
Иногда мне нужно передать массив ручек как int*
в более общие части кода. Сейчас я использую:
int* handles = &textureHandles->handle;
, который по существу принимает указатель на первый элемент структуры и интерпретирует его как массив.
Мой вопрос в основном, если это законно, или если он нарушает строгий псевдоним, чтобы манипулировать int* handles
и Texture* textureHandles
, указывая на ту же память. Я думаю, что это должно быть разрешено, так как базовый тип (int
) доступен в обоих случаях одинаково. Оговорка, которую я имею, связана с тем, что я обращаюсь к нескольким структурам, беря адрес члена внутри одной структуры.
В качестве дополнения к моему первому вопросу, было бы хорошо?
int* handles = reinterpret_cast<int*>(textureHandles);
Вы хотите использовать структуры для получения сильных типов, а затем вы хотите отбросить тип, чтобы получить int. Вы получаете худшее из обоих миров. –
@NeilKirk Только очень специфичные функции будут использовать raw int * массивы. Остальные будут использовать типизированные структуры. Они просто там, чтобы избежать ошибок при использовании ручек в общем случае. – rasmus
Я думаю, вы должны рассказать нам больше о вашем фактическом проекте, так как ваш дизайн очень странный. –