I want to wrap or cast a std:bitset over a given constant data arrary or to formulate it differently, initialize a bitset with foreign data.
The user knows the index of the bit which he can check then via bitset.test(i). Data is big, so it must be efficient. (Machine bitorder does not matter, we can store it in the right way).
Thats what I tried:
constexpr uint32_t data[32] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
constexpr std::bitset<1000> bset(1); //bit bitset initialized with a value here
constexpr std::bitset<1000> bset2(data); //init it with our data, this is not working
The number of bits is 32*32=1024 that is held by data. With my bitset i can address the almost full range. User does not need more than 1000. Can someone please explain to me how this is done in cpp in my example above with bset2?
Unfortunately
std::bitsetdoes not have suitable design for what you want.It is not designed an aggregate (like
std::arrayis) so aggregate initialiation is impossible (and also copying bits into it withstd::memcpyis undefined behavior).It can take only one
unsigned long longinconstexprconstructor.The
operator []andsetmethod will becomeconstexprin C++23 so there will be a way after that.Just use
constexprraw array orstd::arrayand add bit accessing methods until then.