让模板通过指定bitesize在char / short / int之间进行选择?

时间:2012-02-01 11:51:43

标签: c++ templates

我有这样的事情:

template<int SIZE>
struct bin {
private:
public:
    struct {
        int _value : SIZE;
    };
}

是否可以根据SIZE更改_value的数据类型?如果SIZE <= 7,我希望_value成为char。如果它是&gt; = 8且&lt; = 15,我希望它是短的,如果它是&lt; = 31,我希望它是一个整数。

2 个答案:

答案 0 :(得分:10)

这不是特别优雅,但是:

template <unsigned int N>
struct best_integer_type {
    typedef best_integer_type<N-1>::type type;
};

template <>
struct best_integer_type<0> {
    typedef char type;
};

template <>
struct best_integer_type<8> {
    typedef short type;
};

template <>
struct best_integer_type<16> {
    typedef int type;
};

template <>
struct best_integer_type<32> {
    // leave out "type" entirely, to provoke errors
};

然后在你的课堂上:

typename best_integer_type<SIZE>::type _value;

它不处理SIZE的负数。您的原始代码也没有,但如果char,您的文字说明会使用SIZE <= 7。我希望0 <= SIZE <= 7会这样做。

答案 1 :(得分:8)

Boost.Integer有utilities for type selection

  

boost::int_t<N>::least
  最小的内置有符号整数类型,至少有N位,包括符号位。参数应为正数。如果参数大于最大整数类型中的位数,则会产生编译时错误。

     

boost::int_t<N>::fast
  最容易操作的内置有符号整数类型,至少有N位,包括符号位。参数应为正数。如果参数大于最大整数类型中的位数,则会产生编译时错误。