Сообщение Re: Как взять количество элементов из инициализатора? от 26.01.2024 12:21
Изменено 26.01.2024 12:27 rg45
Re: Как взять количество элементов из инициализатора?
Здравствуйте, drVanо, Вы писали:
V>Вот тут хочется на автомате передать количество элементов в инициализаторе в поле size:
V>
V>Сейчас приходится писать руками, может быть есть способ лучше.
Немного оффтопа. Не очень хорошо то, что поля types и size находятся в прямом досттупе и пользователь может модифицировать их независимо друг от друга и тем самым создать рассогласование данных. По-хорошему, такие вещи нужно прятать в закрытой секции и предоставлять безопасный открытый интерфейс, который будет гарантировать согласованность данных. Как вариант, можно написать собственный контейнер общего применения (что-то типа limited_size_vector) и использовать его вместо пары массив-размер. Все сказанное можно проделать с сохранением возможности использования в компайл-тайм (constexpr).
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>Сейчас приходится писать руками, может быть есть способ лучше.
Немного оффтопа. Не очень хорошо то, что поля types и size находятся в прямом досттупе и пользователь может модифицировать их независимо друг от друга и тем самым создать рассогласование данных. По-хорошему, такие вещи нужно прятать в закрытой секции и предоставлять безопасный открытый интерфейс, который будет гарантировать согласованность данных. Как вариант, можно написать собственный контейнер общего применения (что-то типа limited_size_vector) и использовать его вместо пары массив-размер. Все сказанное можно проделать с сохранением возможности использования в компайл-тайм (constexpr). И что примечательно, если так сделать, то проблема инициализации поля size решится автоматически. Ведь если разобраться, то эти две проблемы тесно связаны между собой.
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 решится автоматически. Ведь если разобраться, то эти две проблемы тесно связаны между собой.