我的代码中需要以下两个非常相似的结构:
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);
但是,嗯,这显然没有正确的语法。我怎样才能优雅地解决这个问题?
答案 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;