Почему std :: bitset принимает только значение constexpr? - PullRequest
1 голос
/ 01 марта 2020

Я хочу определить размер набора битов во время выполнения.
Но std::bitset<N> принимает только значения constexpr для N, даже не значения const.
Что означает, что размер набора битов должен быть определен до компиляции.

Я знаю, std::vector обеспечивает оптимизацию для массива bool,
, но в нем отсутствуют нужные мне полезные члены набора битов.

Вопрос 1: Почему N должно быть значением constexpr ?
Ну, я предполагаю, что это потому, что bitset является шаблоном, но все же это огромное неудобство.
Bitset мог бы быть классом , а не шаблоном.
Это Конструктор может принять size_t в качестве аргумента, чем я могу создать набор битов переменной длины.
Тот же вопрос касается std::array.
Может быть std::array<type> foo(size, values).

Вопрос 2. Есть ли какие-нибудь «хаки», которые позволяют мне создавать наборы битов переменной длины?
Я почти уверен, что их не будет, учитывая, как работает шаблон.
Но, может быть, есть какой-то хитрый трюк:)
Если нет, мне придется использовать std::vector<bool> и сам реализовывать элементы bitset.

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Почему N должно быть значением constexpr?

Вы правы. Размер как std::bitset, так и std::array указан в качестве параметра шаблона, поэтому он не может быть установлен во время выполнения.

Однако в прошлом были некоторые предложения по внедрению динамических c массивов в C ++. стандарт. Один из них назывался std::dynarray. В конце концов, он не будет введен в стандарт, но вы можете увидеть здесь более подробное описание его времени жизни.

Есть ли какие-нибудь «хаки», которые позволяют мне создавать переменные длина набора битов?

Если у вас есть доступ к библиотеке Boost, вы можете использовать ее dynamic_bitset .

0 голосов
/ 01 марта 2020

Битовый набор мог быть классом, а не шаблоном.

Он создан для какой-то цели, и если это не ваше, вам просто нужно использовать что-то другое.

Если вы хотите хранить отдельные биты, что означает, что вы хотите хранить bool с переменным размером, вы можете просто использовать std :: vector

Если нет, мне придется использовать std :: vector и самостоятельно реализовать элементы bitset.

Набор битов - это контейнер битов. Так что вы подразумеваете под реализацией bitset?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...