7

に最も近いサイズの整数 (切り上げ) になるfooようなテンプレート構造を書きたいと思います。たとえば、と.foo<N>::value_typeNfoo<32>::value_type => uint32_tfoo<33>::value_type => uint64_tfoo<72>::value_type => uint64_t

これを行うには、たとえばuint8_t などを返すなどfoo、値の範囲に対して の部分的な特殊化を提供する洗練された手段が必要です。1 <= N <= 80 から 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 に答える