template<typename T>
class MyClass
{
......
private:
union u_
{
struct m_
{
int i1;
int i2;
int i3;
} m;
char data[SIZE]; // convenience buffer for serialization/deserialization;
} u;
T container;
......
};
MyClassのオブジェクトをシリアライズ/デシリアライズできるように、私はデータフィールドを結合するためにユニオンを使用し、データバッファを使用して卸売りします。私はデータが誰かの将来の拡張のためにデータメンバーのコレクションのために十分に大きいことを確認したいので、私はこの静的なアサートを追加しました。実際のテンプレートパラメータを指定せずにstatic_assertできますか?
static_assert(sizeof(MyClass<int>::u_::data) >= sizeof(MyClass<int>::u_::m_));
このアプローチには2つの問題があります。まず、コンパイラーは、共用体が公開されていないと不平を言う。第2に、これは任意のコンテナ型Tに当てはまるはずですので、具体的にする必要はありませんが、intをダミー型として与えることはできませんが、静的なアサートのためだけに別の型を導入したくありませんここにダミータイプを使用する方法はありますか?
もっと洗練されたソリューションはありますか?
EDIT:James、移植性の問題を提起してくれてありがとう。エンディアンとアライメントは正当な問題ですが、私の場合はシリアル化/逆シリアル化がローカルで行われるため、問題ありません。
パディングの可能性があるため、これは非常に悪い考えです。コンパイラは構造体メンバの間にバイトを自由に挿入でき、実行時には完全に未定義です。 –
このようにシリアル化を行うことは非常に悪い考えです。しかし、問題の元のコードはすべて同じ問題を抱えていますが、これは少なくともわずかな改善です。 –
@axel:trueですが、この回答は元の質問と同じ精神です。同じタイプ(つまりレイアウト)の2つの構造体のオッズを追加しますが、異なるパディングは私にとってはほとんどスリムに見えます。 – flownt