c++ - 为什么 std::bitset 只取 constexpr 值?

标签 c++ templates std bitset variable-length-array

我想在运行时决定位集的大小。
但是std::bitset<N>只接受 N 的 constexpr 值,甚至不接受 const 值。
这意味着必须在编译之前确定位集的大小。

我知道std::vector为 bool 数组提供优化,
但它缺少我需要的那些有用的位集成员。

问题 1:为什么 N 必须是 constexpr 值?
好吧,我猜那是因为 bitset 是模板,但是,这仍然是巨大的不便。
位组 可能是一个类而不是模板。
它的构造函数可以将 size_t 作为参数,而不是我可以创建可变长度的位集。std::array 也有同样的问题。 .
可能是 std::array<type> foo(size, values) .

问题 2:是否有任何“黑客”可以让我创建可变长度的位集?
考虑到模板的工作原理,我很确定不会有。
但也许,有一些聪明的把戏:)
如果没有,我将不得不使用 std::vector<bool>并自己实现 bitset 成员。

最佳答案

Why does N has to be constexpr value?



你说的对。两者的大小std::bitsetstd::array被指定为模板参数,因此在运行时无法设置。

然而,过去有一些提议在 C++ 标准中引入动态数组。其中之一被称为 std::dynarray .最终,它不会被引入标准,但你可以看到 here对其生命周期的更详尽的描述。

Is there any 'Hacks' that lets me create variable-length bitset?



如果您有权访问 Boost 库,则可以使用它的 dynamic_bitset .

关于c++ - 为什么 std::bitset 只取 constexpr 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60473059/

相关文章:

c++ - C++中有隐式声明之类的东西吗?

c++ - 当类具有 operator() 时的结构特化

c++ - emplace_back() 未按预期运行

结构数组上的 C++ qsort 内部函数

c++ - 蒙特卡洛法计算圆周率

c++ - C++中类模板内的模板类

c++ - 如何跨文件使用单个命名空间?

c++ - C++向chrono::system_clock::time_point添加月份

c++ - 在 C++ 中为动态分配的类型重载 + 运算符

c++ - 遍历具有 int 类型的模板化 C++ 函数