Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::bitset只接受constexpr值?_C++_Templates_Std_Bitset_Variable Length Array - Fatal编程技术网

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使用模板的一般想法是启用所有可能的优化,如果所有参数都是运行时的,则无法完成这些优化。因此,模板的目的是尽可能快地访问单个位。如果使用具有运行时变量大小的容器类这样的东西会更舒服,但肯定会降低速度。我同意您的看法,对于编译时常量位集和运行时变量,使用相同的接口会很好。