我希望编写一个模板结构foo
,使foo<N>::value_type
是最接近大小的整数(向上舍入)到N
。例如foo<32>::value_type => uint32_t
,foo<33>::value_type => uint64_t
和foo<72>::value_type => uint64_t
。
要做到这一点,我需要一种优雅的方法,为一系列值提供foo
的部分特化,例如,1 <= N <= 8
返回uint8_t,依此类推第四。有没有办法完成这个,而不必专门从0到64。
答案 0 :(得分:14)
template<size_t N> struct select { typedef uint64_t result; };
template<> struct select<0> { typedef uint8_t result; };
template<> struct select<1> { typedef uint16_t result; };
template<> struct select<2> { typedef uint32_t result; };
template<size_t N>
struct foo
{
enum{D = (N > 32 ? 3 : (N > 16 ? 2 : (N > 8 ? 1 : 0)))};
typedef typename select<D>::result value_type;
value_type value;
};
在c++11中,您可以使用std::conditional
:
typedef
typename std::conditional<(N > 32), uint64_t,
typename std::conditional<(N > 16), uint32_t,
typename std::conditional<(N > 8), uint16_t, uint8_t>
::type>::type>::type value_type;
您可以决定哪一个不太可读。
答案 1 :(得分:7)
@hansmaad的回答很好,但我更愿意使用(猜猜是什么?!)Boost:
boost::uint_t<N>::least // N: bits
最小的内置无符号整数类型,至少有N位。 参数应为正数。编译时错误 如果参数大于的位数,则得到结果 最大整数类型。
答案 2 :(得分:1)
模板参数需要具体,所以我认为没有办法避免专门针对每个必需的值。