为什么std :: bitset只采用constexpr值?

问题描述 投票:0回答:2

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

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

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

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

c++ templates std bitset variable-length-array
2个回答
0
投票

位集本来可以是一个类,而不是模板。

它是有目的的,如果不是您所需要的,您只需要使用不同的东西。

[如果要存储单个位,这意味着您想存储可变大小的bool,只需使用std::vector< bool >

如果没有,我将不得不使用std :: vector并自己实现bitset成员。

位集是位的容器。那么,您自己实现bitset是什么意思?


0
投票

为什么N必须是constexpr值?

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

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

有没有让我创建可变长度位集的'Hacks'?

如果有权访问Boost库,则可以使用其here

© www.soinside.com 2019 - 2024. All rights reserved.