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, я использую объединение, чтобы объединить свои поля данных, и использую буфер data , чтобы сделать это оптом.Я хочу убедиться, что данные достаточно велики для сбора элементов данных на случай, если кто-то расширит их в будущем, поэтому я добавил это статическое утверждение.
static_assert(sizeof(MyClass<int>::u_::data) >= sizeof(MyClass<int>::u_::m_));
У этого подхода есть две проблемы.Во-первых, компилятор жалуется, что объединение не является публичным.Во-вторых, это должно сохраняться для любого контейнера типа T, поэтому я не хочу быть конкретным, но давать int как фиктивный тип не получится, но я не хочу вводить другой тип только для статического утвержденияЕсть ли способ использовать фиктивный тип здесь?
Есть ли более элегантное решение?
EDIT : Джеймс, спасибо за то, что поднял вопрос о переносимости.Порядковый номер и выравнивание являются законными проблемами, но в моем случае сериализация / десериализация происходит локально, так что все в порядке.