Причина, по которой повторяется часть вопроса, но решение несоответствия типов является действительной проблемой, которую необходимо решить. Для сравнений, которые вы делаете, было бы полезно выделить их, поскольку они имеют определенное многократное значение:
template <typename T> bool fitsIn(const QByteArray &a) {
return static_cast<int>(sizeof(T)) <= a.size();
}
template <typename T> bool fitsIn(T, const QByteArray &a) {
return fitsIn<T>(a);
}
if (fitsIn(ushortIdx0, idx0)) ...
Надеюсь, у вас будет только несколько видов таких сравнений, и было бы наиболее целесообразно СУХОЙ (не повторяться) и вместо копий приведений использовать функции, предназначенные для задачи - функции, которые также выражают цель первоначального сравнения. Тогда становится легко централизовать обработку любых угловых случаев, которые вы, возможно, пожелаете обработать, то есть когда sizeof(T) > INT_MAX
.
Другим подходом было бы определение нового типа для переноса size_t
и адаптация его к типам, с которыми необходимо использовать его:
class size_of {
size_t val;
template <typename T> static typename std::enable_if<std::is_signed<T>::value, size_t>::type fromSigned(T sVal) {
return (sVal > 0) ? static_cast<size_t>(sVal) : 0;
}
public:
template <typename T, typename U = std::enable_if<std::is_scalar<T>::value>::type>
size_of(const T&) : val(sizeof(T)) {}
size_of(const QByteArray &a) : val(fromSigned(a.size())) {}
...
bool operator>=(size_of o) const { return value >= o.value; }
};
if (size_of(idx0) >= size_of(ushortIdx0)) ...
Это концептуально расширит sizeof
и специализирует его для сравнения (ий) и ничего больше.