2014-06-11 5 views
2

Я пытаюсь получить размер битполя.C++ Как получить размер членов битового поля?

К примеру, я получил общую ручку:

template<size_t n, size_t m> 
struct handle 
{ 
    uint32 index : n; 
    uint32 validation : m; 
} 

Теперь я хочу, чтобы получить размер членов.

Я нашел макрос, который работает, когда у меня есть handle<16, 16> и расширяет желаемые элементы до sizeof. В этом случае, если я перехожу в index, я получаю 16 в качестве моего вывода.

Но там я должен был бы передать свою выходную переменную.

Есть ли способ, возможно, с помощью магии шаблона, чтобы развернуть прямо на нужный номер? Итак, я мог бы пройти в sizeof_bit(class, member) и получил sizebit размер этого пользователя?

+0

sizeof (uint32) или sizeof (n) получит размер члена в байтах (8 бит на каждый байт). Хотя вы явно определяете их как 32 бита. так что я предполагаю, что у вас другой вопрос? – IdeaHat

+1

@MadScienceDreams: Я думаю, он хочет знать значение 'n' и' m', т. Е. Сколько бит в битполе. ('' У вас не должно быть ровно 8 бит на байт. '') – Lstor

+2

Возможно, вам стоит поделиться макросом, который работает, и определить источник информации. Скорее всего, это не способ восстановить размеры бит-полей через 'sizeof()' et al. Вероятно, вам придется записывать их как часть типа - небитоподобные члены, которые хранят 'n' и' m' и инициализируются конструкторами. –

ответ

3

Может быть что-то вроде

template<size_t n, size_t m> 
struct handle 
{ 
    enum { index_bits = n }; 
    enum { validation_bits = m }; 
    uint32_t index : n; 
    uint32_t validation : m; 
}; 

Demo.

Если у вас нет контроля над структурой, определяющей бит, вы можете сделать что-то вроде this, чтобы подсчитать количество бит в нем во время выполнения, но это довольно неэффективно.

+0

макрос это #define SIZEOF_BITFIELD (класс, член, вне) {\ класс tmp_; \ tmp_.member = ~ 0; \ unsigned int tmp2_ = tmp_.member; \ ++ tmp2_; \ out = log2 (tmp2_); \ } из http://stackoverflow.com/questions/539251/getting-the-size-of-an-indiviual-field-from-ac-struct-field/539307#539307 наверняка я мог бы сохранить количество бит в дескрипторе, но затем сохранение его каждый раз в дескрипторе было бы очень неэффективным :( –

+1

@ user3731014 В приведенном выше коде члены 'enum' (' index_bits' и т. д.) являются константами времени компиляции и не являются на самом деле хранится в объектах 'handle'. Именно поэтому GCC создает предупреждение, связанное с переменной, но не используемое в связанном демо-коде. –

+0

Хорошо, но могу ли я использовать их в другом классе без накладных расходов? Пример: template struct ничего {int anarray [2^handletype :: index_bits]} –

Смежные вопросы