模板编程和位字段

时间:2014-04-09 22:29:09

标签: c++ templates bit-fields

我的代码中需要以下两个非常相似的结构:

union ArrayEntry2Byte {          union ArrayEntry4Byte {
  struct {                         struct {
    char foo : 1;                    char foo : 1;
    short bar : 15;                   int bar : 31;
  };                               };
  short foobar;                    int foobar;
  // other code                    // other code
};                               };

为了提高此代码的可维护性和优雅性,我想使用模板编程删除其中一个结构:

template<typename value_type>
union ArrayEntry {
  struct {
    char foo : 1;
    value_type bar : 15;
  };
  value_type foobar;
  // other code
};

然而,位域让我陷入困境。我只需要这样的东西:

value_type bar : (value_type == short ? 15 : 31);

但是,嗯,这显然没有正确的语法。我怎样才能优雅地解决这个问题?

2 个答案:

答案 0 :(得分:5)

这是一个C ++ 11解决方案:

#include <limits>

template <typename value_type>
union ArrayEntry {
    struct {
        char foo : 1;
        value_type bar : std::numeric_limits<value_type>::digits;
    };
    value_type foobar;
    // other code
};

答案 1 :(得分:3)

创建一个返回正确值的私有模板:

template<typename T>
struct bitFieldValue : std::integral_constant<int, 31>
{ };

template<>
struct bitFieldValue<short> : std::integral_constant<int, 15>
{ };

然后是:

value_type bar : bitFieldValue<value_type>::value;