Информация об изменениях

Сообщение Re: Как взять количество элементов из инициализатора? от 26.01.2024 12:21

Изменено 26.01.2024 12:27 rg45

Re: Как взять количество элементов из инициализатора?
Здравствуйте, drVanо, Вы писали:

V>Вот тут хочется на автомате передать количество элементов в инициализаторе в поле size:


V>
V>    struct token_encoding_t
V>    {
V>        token_type_id types[20];
V>        uint8_t size;
V>        uint8_t bits;
V>    };
V>


V>Сейчас приходится писать руками, может быть есть способ лучше.


Немного оффтопа. Не очень хорошо то, что поля types и size находятся в прямом досттупе и пользователь может модифицировать их независимо друг от друга и тем самым создать рассогласование данных. По-хорошему, такие вещи нужно прятать в закрытой секции и предоставлять безопасный открытый интерфейс, который будет гарантировать согласованность данных. Как вариант, можно написать собственный контейнер общего применения (что-то типа limited_size_vector) и использовать его вместо пары массив-размер. Все сказанное можно проделать с сохранением возможности использования в компайл-тайм (constexpr).
Re: Как взять количество элементов из инициализатора?
Здравствуйте, drVanо, Вы писали:

V>Вот тут хочется на автомате передать количество элементов в инициализаторе в поле size:


V>
V>    struct token_encoding_t
V>    {
V>        token_type_id types[20];
V>        uint8_t size;
V>        uint8_t bits;
V>    };
V>


V>Сейчас приходится писать руками, может быть есть способ лучше.


Немного оффтопа. Не очень хорошо то, что поля types и size находятся в прямом досттупе и пользователь может модифицировать их независимо друг от друга и тем самым создать рассогласование данных. По-хорошему, такие вещи нужно прятать в закрытой секции и предоставлять безопасный открытый интерфейс, который будет гарантировать согласованность данных. Как вариант, можно написать собственный контейнер общего применения (что-то типа limited_size_vector) и использовать его вместо пары массив-размер. Все сказанное можно проделать с сохранением возможности использования в компайл-тайм (constexpr). И что примечательно, если так сделать, то проблема инициализации поля size решится автоматически. Ведь если разобраться, то эти две проблемы тесно связаны между собой.