我必須檢查某人的笨拙代碼,該代碼使用了20多個聯合,並根據數字方式將數據從字節數組中竄改並複製,以便通過模板實現這些方法(第二個字符)使用模板打字
template <class T> class type_punner
{
T& p;
unsigned char* pun;
public:
type_punner(T& ref): p (ref), pun(reinterpret_cast<unsigned char*>(&p))
{
static_assert(std::is_pod<T>::value, "type_punner can be used only for POD");
}
inline unsigned char& at(std::size_t i)
{
#ifdef QT_DEBUG
if(!(i < size())) throw std::out_of_range(__FUNCTION__);
#endif
#if (Q_BYTE_ORDER == Q_LITTLE_ENDIAN)
return pun[i];
#else
return pun[size() - i - 1];
#endif
}
inline unsigned char& reverse_at(std::size_t i)
{
#ifdef QT_DEBUG
if(!(i < size())) throw std::out_of_range(__FUNCTION__);
#endif
#if (Q_BYTE_ORDER == Q_LITTLE_ENDIAN)
return pun[size() - i - 1];
#else
return pun[i];
#endif
}
// = 0 is LSB
inline unsigned char& operator[](std::size_t i)
{
return at(i);
}
inline std::size_t size()
{
return sizeof(T);
}
};
只有我擔心,如果我保持標準兼容並通過返回的引用分配新值是有效的。
那麼,它是在任何情況下未定義的行爲,根據標準去。這是你的工作,以確保你不會產生hydras。 – DeiDei
@DeiDei我實際上並沒有生成九頭蛇,這不是同事創造九頭蛇的最壞例子。關於轉換爲字符類型指針等的規則發生了什麼?真的,沒有根據的評論是沒有幫助的,順便說一句,沒有辦法解決這個問題A)的目的是顯示數據並以反向或者直線的順序打包B)除了C++之外沒有其他的東西 – Swift