История изменений
Исправление mittorn, (текущая версия) :
Можно было бы сделать перегружаемые операторы sizeof и offsetof. Тогда доступ к полю элемента был бы согласно перегруженному offsetof и это решает всю «магию». Только я не совсем понимаю, какой синтаксис должен быть у перегрузки offsetof - ведь в этом макросе передаётся имя элемента в виде идентификатора. Возможно что-то вроде:
size_t operator offsetof(field3)() const
{return offsetof(field2) + field1;}
где тело offsetof будет являться частью имени оператора с соответствующей семантикой.
Тогда если sizeof не константный - то в целом объект ведёт себя как объект с flexible array member - нельзя использовать нигде, где требуется статическая аллокация и где sizeof используется в статическом контексте, зато вокруг этого всего смогут работать всякие сериализаторы и динамические аллокаторы просто получая размеры в рантайме.
Так же такой оператор может генерироваться автоматически если размер элемента field[] в структуре задан как зависимость от другого элемента в структуре: char field2[field1];
Исправление mittorn, :
Можно было бы сделать перегружаемые операторы sizeof и offsetof. Тогда доступ к полю элемента был бы согласно перегруженному offsetof и это решает всю «магию». Только я не совсем понимаю, какой синтаксис должен быть у перегрузки offsetof - ведь в этом макросе передаётся имя элемента в виде идентификатора. Возможно что-то вроде:
size_t operator offsetof(field3)() const
{return offsetof(field2) + field1;}
где тело offsetof будет являться частью имени оператора с соответствующей семантикой.
Тогда если sizeof не константный - то в целом объект ведёт себя как объект с flexible array member - нельзя использовать нигде, где требуется статическая аллокация и где sizeof используется в статическом контексте, зато вокруг этого всего смогут работать всякие сериализаторы и динамические аллокаторы просто получая размеры в рантайме
Исходная версия mittorn, :
Можно было бы сделать перегружаемые операторы sizeof и offsetof. Тогда доступ к полю элемента был бы согласно перегруженному offsetof и это решает всю «магию». Только я не совсем понимаю, какой синтаксис должен быть у перегрузки offsetof - ведь в этом макросе передаётся имя элемента в виде идентификатора. Возможно что-то вроде:
```
size_t operator offsetof(field3)() const
{return offsetof(field2) + field1;}
```
где тело offsetof будет являться частью имени оператора с соответствующей семантикой.
Тогда если sizeof не константный - то в целом объект ведёт себя как объект с flexible array member - нельзя использовать нигде, где требуется статическая аллокация и где sizeof используется в статическом контексте, зато вокруг этого всего смогут работать всякие сериализаторы и динамические аллокаторы просто получая размеры в рантайме