模板:如何选择包含n位的最小int类型?

Bor*_*rph 2 c++ templates c++11

对于std::bitset我使用的(std forbidden)自己的实现uint_fast32_t,因为它在64位CPU上更快.评论说明是节省小集的空间,例如bitset <6>不应该使用8个字节.如果考虑结构中的对齐,浪费甚至更多.

使用C++ 11很好.我想优雅地选择:

  • 大小<= 8:uint8_t
  • 大小<= 16:uint16_t
  • 大小<= 32:uint32_t
  • 大小> 32:uint_fast32_t

作为我班级的存储类型:

template<size_t Size>
struct BitSet {
    typedef <expression> StorageType;
    // an array of that storage type...
};
Run Code Online (Sandbox Code Playgroud)

我可以想到相当笨拙的助手模板,但也许在C++ 11中有更优雅的东西.

编辑:澄清:uint_fast8_t对于原始类会很好,编译器可以选择快速的任何东西.想象一下尺寸== 1000000.但是在某些机器上它会是64位,并且当某些用例中的大小很重要时,例如Size == 4,这意味着会浪费7个字节.

Hol*_*Cat 6

鉴于可能的类型选择很少,我只是硬编码条件:

using StorageType = std::conditional_t<Size <=  8, uint8_t,
                    std::conditional_t<Size <= 16, uint16_t,
                    std::conditional_t<Size <= 32, uint32_t, uint_fast32_t>>>;
Run Code Online (Sandbox Code Playgroud)

或者,使用类似于@ Caleth答案的技巧:

using StorageType = std::tuple_element_t<(Size > 8) + (Size > 16) + (Size > 32),
                        std::tuple<uint8_t, uint16_t, uint32_t, uint_fast32_t>>;
Run Code Online (Sandbox Code Playgroud)