fiz*_*fiz 7 c++ struct typedef
我目前正在尝试在C++ 11中模拟一些固件.在固件中,我们有一个32位的固定数据长度,我们将这32位分成更小的数据包,例如,我们有一个9位大小的数据包,另外6位被打包成32位字.
在C++中,我想确保我输入的数据具有这些长度.我不在乎是否溢出,只是只有9位被操作或传递给另一个函数.
理想情况下,我想要一些简单的typedef:
only_18_bits some_value;
Run Code Online (Sandbox Code Playgroud)
struct sel_vals{
int_fast32_t m_val : 18;
int_fast8_t c_val : 5;
}
Run Code Online (Sandbox Code Playgroud)
但这有点烦人,因为每当我想使用它时我都必须这样做:
sel_vals somevals;
somevals.m_val = 5;
Run Code Online (Sandbox Code Playgroud)
对我来说似乎有点冗长,我必须首先声明结构.
也是出于显而易见的原因,我不能只做以下事情:
typedef sel_vals.m_val sel_vals_m_t;
typedef std::vector<sel_vals_m_t>;
Run Code Online (Sandbox Code Playgroud)
我可以使用,std::bitset<9>但每当我想做一些数学我必须将其转换为无符号,它只是有点凌乱.我想避免一塌糊涂.
有任何想法吗?
我建议使用包装外观,大致如下:
#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;
Run Code Online (Sandbox Code Playgroud)
只需做一点工作,您就可以定义直接在这些模板上运行的数学运算符重载。
如果模板参数足够小,只需做一点工作,您就可以使用此模板来选择较小的内部值uint32_t、uint16_t或uint8_t。nbits