C++ 如何在typedef中定义一组位数? 问题

C++ 如何在typedef中定义一组位数? 问题,c++,struct,typedef,C++,Struct,Typedef,我目前正在尝试用C++11模拟一些固件。在固件中,我们有一个32位的固定数据长度,我们将这32位分成更小的数据包,例如,我们有一个9位大小的数据包,另一个6位大小的数据包被打包到32位字中 在C++中,我想确保我键入的数据是那些长度。我不在乎是否溢出,只在乎只有9位被操作或传递到另一个函数上 理想情况下,我想要一些简单的类型定义,如: only_18_bits some_value; 我的尝试 但这有点烦人,因为每当我想使用它时,我都必须这样做: sel_vals somevals; some

我目前正在尝试用C++11模拟一些固件。在固件中,我们有一个32位的固定数据长度,我们将这32位分成更小的数据包,例如,我们有一个9位大小的数据包,另一个6位大小的数据包被打包到32位字中

<>在C++中,我想确保我键入的数据是那些长度。我不在乎是否溢出,只在乎只有9位被操作或传递到另一个函数上

理想情况下,我想要一些简单的类型定义,如:

only_18_bits some_value;
我的尝试 但这有点烦人,因为每当我想使用它时,我都必须这样做:

sel_vals somevals;
somevals.m_val = 5;
对我来说似乎有点冗长,而且我必须先声明结构

同样出于显而易见的原因,我不能只做以下事情:

typedef sel_vals.m_val sel_vals_m_t;
typedef std::vector<sel_vals_m_t>;
typedef sel_vals.m_vals sel_vals m_t;
typedef-std::vector;
我可以使用
std::bitset
,但每当我想做一些数学运算时,我必须将其转换为无符号,这会变得有点混乱。我想避免混乱


有什么想法吗?

我建议使用包装外观,大致如下:

#include <cstdint>

template<int nbits> class bits {

   uint64_t value;

   static const uint64_t mask = (~(uint64_t)0) >> (64-nbits);

public:
   bits(uint64_t initValue=0) : value(initValue & mask) {}

   bits &operator=(uint64_t newValue)
   {
       value=newValue & mask;
   }

   operator uint64_t() const { return value; }
};

//

bits<19> only_19_bits_of_precision;
#包括
模板类位{
uint64_t值;
静态常数uint64_t掩码=(~(uint64_t)0)>>(64个字节);
公众:
位(uint64_t initValue=0):值(initValue和掩码){}
位和运算符=(uint64\u t newValue)
{
值=新值和掩码;
}
运算符uint64_t()常量{返回值;}
};
//
仅位精度为19位;
只需做一点工作,就可以定义直接对这些模板进行操作的数学运算符重载


如果
nbits
模板参数足够小,只需稍微多做一点工作,就可以使用此模板来选择一个较小的内部值,
uint32\u t
uint16\u t
uint8\u t

如果您的类型是一个简单的整数,我不确定您需要做些什么。你仍然需要做
int-somevals;部分=5
那么,您想如何使用它,而使用位字段是不允许的呢?有没有理由不创建一个带有掩码值的小类,该掩码值应用于它构造或分配的任何值?为了方便使用,您可以使用
运算符int()const
。@Galik,因为我有很多模拟数据从文本文件输入到这个程序中。有时,我们可能希望更改32位字内的这些“数据包”长度,以优化我们正在做的事情。您可以想象,实际上上面是
m_val:SIZE_m
,其中
SIZE_m
是在别处定义的
SIZE_t
常量。这是一个安全预防措施,以确保我在这里输入的相同数据与我在固件中输入数据时给出的结果相同。@TonyD这是一个好主意,甚至模板也可以工作得更好。在我决定使用一种方法之前,我只是在不断地交换想法。
#include <cstdint>

template<int nbits> class bits {

   uint64_t value;

   static const uint64_t mask = (~(uint64_t)0) >> (64-nbits);

public:
   bits(uint64_t initValue=0) : value(initValue & mask) {}

   bits &operator=(uint64_t newValue)
   {
       value=newValue & mask;
   }

   operator uint64_t() const { return value; }
};

//

bits<19> only_19_bits_of_precision;