C++ 为什么std::bitset只接受constexpr值?
我想在运行时确定位集的大小。C++ 为什么std::bitset只接受constexpr值?,c++,templates,std,bitset,variable-length-array,C++,Templates,Std,Bitset,Variable Length Array,我想在运行时确定位集的大小。 但是std::bitset只接受N的constexpr值,甚至不接受const值。 这意味着在编译之前必须确定位集的大小 我知道std::vector为布尔阵列提供了优化, 但它缺少我需要的有用的位集成员 问题1:为什么N必须是constexpr值? 嗯,我猜这是因为位集是模板,但这仍然是极大的不便。 位集可能是类而不是模板。 它的构造函数可以将size\u t作为参数,这样我就可以创建可变长度的位集。 同样的问题也适用于std::array 可能是std::arr
但是
std::bitset
只接受N的constexpr值,甚至不接受const值。这意味着在编译之前必须确定位集的大小 我知道
std::vector
为布尔阵列提供了优化,但它缺少我需要的有用的位集成员 问题1:为什么N必须是constexpr值?
嗯,我猜这是因为位集是模板,但这仍然是极大的不便。
位集可能是类而不是模板。
它的构造函数可以将size\u t作为参数,这样我就可以创建可变长度的位集。
同样的问题也适用于
std::array
可能是
std::array foo(大小、值)
问题2:有没有让我创建可变长度位集的“黑客”方法?考虑到模板是如何工作的,我很确定不会有任何模板。
但也许有一些聪明的把戏:)
如果没有,我将不得不使用
std::vector
并自己实现位集成员
位集可能是一个类而不是一个模板
它是有目的的,如果不是你的,你只需要使用不同的东西
如果您想存储单个位,这意味着您喜欢使用可变大小存储bool
,您只需使用
否则,我将不得不使用std::vector并自己实现位集成员
位集是位的容器。那么,您自己实现位集是什么意思呢
为什么N必须是constexpr值
你说得对。std::bitset
和std::array
的大小都指定为模板参数,因此不能在运行时设置
然而,过去在C++标准中引入了动态数组的一些建议。其中一个被叫来了。最终,它将不会被引入标准,但您可以看到对其生命周期的更详细描述
有没有什么“黑客”可以让我创建可变长度的位集
如果您可以访问Boost库,您可以使用它的。通过自己实现位集,我指的是位集成员函数,如翻转、设置、重置、到字符串等。std::位集甚至支持按字符串或整数值初始化。vector没有,所以我得自己做。此外,“它是为一个目的而制造的”。好吧,至少让我知道那个目的是什么!历史原因?“历史原因?”听不懂你的意思吗?你觉得模板是历史性的吗?对不起,不知道你的意图是什么…好的。对我来说,如果比特集是一个类,它会更有用。但事实并非如此。那么,为什么呢?是否有逻辑或历史原因?或者也许没有理由,将来可能会改变?不管怎么说,看起来你也不知道,因为你的回答更像是“好吧,处理好它”。我会处理它,但嘿,我只是好奇:)@Ultim8\u Clock使用模板的一般想法是启用所有可能的优化,如果所有参数都是运行时的,则无法完成这些优化。因此,模板的目的是尽可能快地访问单个位。如果使用具有运行时变量大小的容器类这样的东西会更舒服,但肯定会降低速度。我同意您的看法,对于编译时常量位集和运行时变量,使用相同的接口会很好。