指定された数値を表すことができる最小の符号付き整数型を返すテンプレートを作成したいと思います。これが私の解決策です:
/**
* Helper for IntTypeThatFits.
* Template parameters indicate whether the given number fits into 8, 16 or 32
* bits. If neither of them is true, it is assumed that it fits 64 bits.
*/
template <bool fits8, bool fits16, bool fits32>
struct IntTypeThatFitsHelper { };
// specializations for picking the right type
// these are all valid combinations of the flags
template<> struct IntTypeThatFitsHelper<true, true, true> { typedef int8_t Result; };
template<> struct IntTypeThatFitsHelper<false, true, true> { typedef int16_t Result; };
template<> struct IntTypeThatFitsHelper<false, false, true> { typedef int32_t Result; };
template<> struct IntTypeThatFitsHelper<false, false, false> { typedef int64_t Result; };
/// Finds the smallest integer type that can represent the given number.
template <int64_t n>
struct IntTypeThatFits
{
typedef typename IntTypeThatFitsHelper<
(n <= numeric_limits<int8_t>::max()) && (n >= numeric_limits<int8_t>::min()),
(n <= numeric_limits<int16_t>::max()) && (n >= numeric_limits<int16_t>::min()),
(n <= numeric_limits<int32_t>::max()) && (n >= numeric_limits<int32_t>::min())
>::Result Result;
};
ただし、GCCはこのコードを受け入れません。「データ型の範囲が制限されているため、比較は常にtrueです[-Werror=type-limits]」というエラーが表示されます。なぜそれが起こるのですか?nは符号付き64ビット整数であり、nの値が異なると、すべての比較がtrueまたはfalseになる可能性がありますか、それとも何かを見落としていますか?
助けていただければ幸いです。
編集:私はC++11を使用していることに言及する必要があります。