有没有办法找出std::bitset
的大小?
我有
typedef std::bitset<64> Bitset;
我希望在不创建实例的情况下知道大小。例如。比如Bitset::size
当我查看bitset.h
中的来源时,这对我来说是完全不可读的,但即使我找到了这些行
public:
enum {_EEN_BITS = _Bits};
typedef _Bitset_base<_Bits <= 8 ? 1
: _Bits <= 16 ? 2
: _Bits <= 32 ? 4
: 8> _Mybase;
typedef typename // sic
_Mybase::_Ty _Ty;
我认为,_Ty
可以包含尺寸,但当我尝试拨打Bitset::_Ty
时,我会illegal use of this type as an expression
我知道在我输入bitset之前我可以存储大小,但这不是我想要的。
答案 0 :(得分:7)
使用Bitset::digits
代替,在您的情况下对应于64。
编辑:由于结果不对,这是一个不同的解决方案:
template< typename T >
struct GetSize;
template< size_t Len >
struct GetSize< std::bitset< Len > >
{
enum { Length = Len };
};
使用如:
const size_t bitsetLength = GetSize< std::bitset< 1024 > >::Length;
答案 1 :(得分:2)
因为每个C ++标准库容器std::bitset
都有size()
方法。在大多数情况下,使用size()
很好,因为它将由编译器内联。
在C ++ 03中,没有可以使用的公共成员,例如在参数化其他模板时。
因为size()
方法声明为constexpr
,您可以使用它来参数化C ++ 11中的模板,就像这样:
std::bitset<34> b;
std::bitset<b.size()> bx;
标准版仍未定义您可以移植使用的std::bitset<N>
的任何成员。在您的问题中,有一个片段定义enum {_EEN_BITS = _Bits};
,因此std::bitset<N>::_EEN_BITS
应该等于N
,但这仅在Visual Studio中可用。
答案 2 :(得分:2)
就像RafałRawicki在答案中建议的那样使用std::bitset<n>().size()
。
编译器将优化临时实例(使用-O2编译时):
76:test.cpp **** int i = std::bitset<8>().size();
77:test.cpp ****
78:test.cpp **** std::cout << i << std::endl;
68 .loc 1 78 0
69 0009 C7442404 movl $8, 4(%esp) #,
69 08000000
70 0011 C7042400 movl $_ZSt4cout, (%esp) #,
70 000000
71 0018 E8FCFFFF call _ZNSolsEi #
答案 3 :(得分:2)
是的,模板参数推断工作正常:
template<size_t N> char (&getBitsetSize(std::bitset<N>))[N];
用法:sizeof(getBitsetSize(Bitset());
C ++ 03解决方案,对于C ++ 11,使用RafałRawicki的答案。