7

我希望编写一个模板结构foo,它foo<N>::value_type是最接近的大小整数(向上舍入)到N. 例如和。foo<32>::value_type => uint32_t_foo<33>::value_type => uint64_tfoo<72>::value_type => uint64_t

为此,我需要一种优雅的方法来foo为一系列值提供部分特化,例如,1 <= N <= 8返回 uint8_t 等等,等等。有没有一种方法可以做到这一点,而不必专门化从 0 到 64 的所有内容。

4

3 回答 3

15
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;
};

中,您可以使用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;

您可以决定哪个可读性较差。

于 2011-10-04T17:34:27.490 回答
7

@hansmaad 答案是一个不错的答案,但我更愿意使用(猜猜是什么?!)Boost

boost::uint_t<N>::least // N: bits

最小的、内置的、至少有 N 位的无符号整数类型。该参数应为正数。如果参数大于最大整数类型的位数,则会导致编译时错误。

于 2011-10-04T17:47:33.213 回答
1

模板参数需要具体,所以我认为没有任何方法可以避免专门针对每个所需值。

于 2011-10-04T17:23:24.400 回答