Этот тип вещей не рекомендуется, поскольку он не гарантируется стандартом C++. Однако большинство компиляторов явно определяют свое поведение в макете памяти (часто на основе каждой архитектуры) и предоставляют #pragma
с для управления поведением упаковки (например, #pragma pack
в MSVC). Если вы понимаете/используете эти функции, вы можете заставить его работать с большинством данных компиляторов/архитектур. Тем не менее, это будет не быть портативным! Для каждого нового компилятора вам необходимо перепроверить и настроить дорогостоящую задачу обслуживания. Как правило, мы предпочитаем большую легкость переносимости.
Если вы действительно хотите это сделать, вы можете добавить static_assert
, чтобы проверить поведение компилятора.
int operator[] (const int index) const
{
static_assert(sizeof(SomeClass) == 4 * sizeof(mA), "Padding not supported");
return ((int*)(this))[index];
}
Поскольку стандарт не позволяет членам быть заказаны, логически мы можем сделать вывод, что если размер SomeClass
составляет 16, то этот код будет работать, как ожидалось. С утверждением мы, по крайней мере, уведомлены, если кто-то строится на другом компиляторе, и он пытается его проложить (таким образом, запутывая нас).
Однако мы можем быть совместимыми со стандартами и получать имена для слотов массива. Вы можете рассмотреть такой шаблон, как:
class SomeClass
{
enum Index {
indexA,
indexB,
indexC,
indexD,
indexCount;
};
int mData[indexCount];
public:
int operator[] (const int index) const
{
return mData[index];
}
int& A() { return mData[indexA]; }
int& B() { return mData[indexB]; }
int& C() { return mData[indexC]; }
int& D() { return mData[indexD]; }
};
Это обеспечивает аналогичную функциональность, но гарантируется стандартом C++.
Просто по чистой случайности это работает –
Это действительно не работает, это неопределенное поведение. если бы ваш класс был более сложным, он определенно дал бы вам тарабарщину –
Итак, даже если пользователь хороший гражданин и использует только индекс от 0 до 3 ... он все еще не гарантирован, что индекс 0 возвращает mA? – ChaoSXDemon