Это моя проблема, у меня есть структура (которую я не могу изменить), например:
struct X
{
uint8_t fieldAB;
uint8_t fieldCDE;
uint8_t fieldFGH;
...
}
Каждое поле этой структуры содержит разные значения, упакованные с использованием битовой маски (битового поля), то есть, например, fieldAB
содержит два разных значения (A и B) в полубайтах hi/lo, а fieldCDE
содержит три разных значения (C, D и E с следующая битовая маска: бит 7-6, бит 5-4-3, бит 2-1-0) и так далее...
Я хотел бы написать простой API для чтения и записи этого значения с помощью enum, который позволяет легко получить доступ к значениям каждого поля:
getValue(valueTypeEnum typeOfValue, X & data);
setValue(valueTypeEnum typeOfValue, X & data, uint8_t value);
Где перечисление valueTypeEnum выглядит примерно так:
enum valueTypeEnum
{
A,
B,
C,
D,
E,
...
}
Моя идея состояла в том, чтобы использовать карту (словарь), которая с учетом valueTypeEnum возвращает используемую битовую маску и смещение для доступа к правому полю структуры, но я думаю, что это немного сложно и не так элегантно. Каковы ваши предложения?
std::bitset
для управления битами. - person tillaert   schedule 17.07.2014