C++ 使用Qt和template交换endianess
我使用Qt交换endianess,同时逐字段读取缓冲区并将结果放入数据结构中 由于结构的字段既是整数类型又是浮点类型,所以我尝试使用模板和模板专门化,但我的代码没有编译 模板专门化的原因是避免为浮点类型调用Qt工具,因为它们不是为此类类型定义的(因为endianess是一个仅限整数的问题)。但编译器抱怨说,我仍然在为C++ 使用Qt和template交换endianess,c++,qt,templates,endianness,template-specialization,C++,Qt,Templates,Endianness,Template Specialization,我使用Qt交换endianess,同时逐字段读取缓冲区并将结果放入数据结构中 由于结构的字段既是整数类型又是浮点类型,所以我尝试使用模板和模板专门化,但我的代码没有编译 模板专门化的原因是避免为浮点类型调用Qt工具,因为它们不是为此类类型定义的(因为endianess是一个仅限整数的问题)。但编译器抱怨说,我仍然在为float调用qFromBigEndian函数 代码如下: class Iterator { public: inline Iterator(con
float
调用qFromBigEndian
函数
代码如下:
class Iterator
{
public:
inline Iterator(const char * buffer) :
_it(buffer)
{}
template <typename T>
inline void readNext(T & field)
{
field = qFromBigEndian(*reinterpret_cast<const T *>(_it));
_it += sizeof(T);
}
template <>
inline void readNext<float>(float & field)
{
field = *reinterpret_cast<const float *>(_it);
_it += sizeof(float);
}
template <>
inline void readNext<double>(double & field)
{
field = *reinterpret_cast<const double *>(_it);
_it += sizeof(double);
}
private:
const char * _it;
};
类迭代器
{
公众:
内联迭代器(常量字符*缓冲区):
_it(缓冲区)
{}
样板
内联void readNext(T字段和字段)
{
字段=qFromBigEndian(*重新解释强制转换(_it));
_it+=sizeof(T);
}
样板
内联void readNext(浮动和字段)
{
字段=*重新解释强制转换(\u it);
_it+=sizeof(浮动);
}
样板
内联void readNext(双字段(&F)
{
字段=*重新解释强制转换(\u it);
_it+=sizeof(双倍);
}
私人:
常量字符*_it;
};
看起来您正在尝试做一些已经做过的事情。简单的使用,很好的提示。我正在尝试使用QDataStream,但不幸的是它不起作用:在浮点字段上出现了中断。我应该发布另一个问题来解释…更仔细地阅读文档。检查:我已经读过这个方法,但我只是不想切换浮点精度,因为有些字段是双精度的,有些是浮点数,这可能会改变。我想在operator>>中对其进行模板化,但看起来不是。请重新阅读!设置版本
Qt_4_5
,它将根据需要工作一次,对于float
为32位,对于double
为64位。