如何表达“大于T的最小整数类型”?

ein*_*ica 5 c++ templates idiomatic generic-programming

假设我有一个整数类型T(有符号或无符号)。我想(在编译时)引用最小的整数类型(有符号或无符号),该类型可以容纳加std::numeric_limits<T>::max()号1(在非溢出意义上,我的意思是)。

有什么好的通用方法吗?

ein*_*ica 3

对于无符号类型,这样做可以解决问题:

template <typename T>
constexpr unsigned size_in_bits() { return  sizeof(T) * CHAR_BIT; }

template <typename T>
using least_larger_uint_t = 
    typename boost::uint_t<size_in_bits<T>() + 1>::least;
Run Code Online (Sandbox Code Playgroud)

如果我们希望某些东西适用于任何整数类型:

template <typename T, int NumBits>
using boost_integer_type = 
    typename std::conditional<
        std::is_unsigned<T>::value,
        boost::uint_t<NumBits>, 
        boost::int_t<NumBits>
    >::type;

template <typename T>
constexpr unsigned size_in_bits() { return sizeof(T) * CHAR_BIT; }

template <typename T>
using least_larger_integral_t = 
    typename boost_integer_type<T, size_in_bits<T>() + 1>::least;
Run Code Online (Sandbox Code Playgroud)

有关和的详细信息,请参阅Boost.Integer 的文档int_t<N>uint_t<N>