私は、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);
}
};
標準に準拠し、返された参照を使用して新しい値を割り当てると、私が心配していることのみが有効です。
さて、標準の通り、未定義の動作です。あなたがハイドラを産まないようにすることはあなたの仕事です。 – DeiDei
@DeiDei私は実際にハイドラを育てません。それは同僚によるハイドラを作成する最悪の例ではありません。キャラクタ型ポインタへのキャストに関するルールなどはどうでしたか?実際には、そのような非地面のコメントは役に立ちません、btw、A)目的はデータを表示し、それを逆順または真っ直ぐな順序でパックすることです。B)C++は利用できません – Swift