如何在编译时找出std :: bitset的大小

时间:2012-03-26 07:27:06

标签: c++

有没有办法找出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之前我可以存储大小,但这不是我想要的。

4 个答案:

答案 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的答案。