Bor*_*rph 2 c++ templates c++11
对于std::bitset我使用的(std forbidden)自己的实现uint_fast32_t,因为它在64位CPU上更快.评论说明是节省小集的空间,例如bitset <6>不应该使用8个字节.如果考虑结构中的对齐,浪费甚至更多.
使用C++ 11很好.我想优雅地选择:
作为我班级的存储类型:
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个字节.
鉴于可能的类型选择很少,我只是硬编码条件:
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)