Существует много способов обработки разных типов данных. Помимо решения объединения вы можете использовать общую структуру, такую как:
typedef struct
{
char m_type;
void* m_data;
}
structData;
Таким образом, вы знаете тип и можете привести указатель void * к нужному типу.
Это похоже на объединенное решение - это скорее C, чем C ++ способ ведения дел.
Путь C ++ был бы чем-то, использующим наследование. Вы определяете базовый класс «Data», используя наследование, чтобы специализировать данные. При необходимости вы можете использовать RTTI для проверки типа.
Но, как вы заявили, вам нужно отправить данные через очередь VxWork. Я не специалист, но если эти очереди являются очередями ОС в реальном времени, все предыдущие решения не являются хорошими. Ваша проблема в том, что ваши данные имеют переменную длину (в частности, строку), и вам нужно отправить их через очередь, которая, вероятно, запрашивает что-то вроде фиксированного отрезка длины данных и фактическую длину этого отрезка времени.
По моему опыту, правильный способ справиться с этим - сериализовать данные в нечто вроде буферного класса / структуры. Таким образом, вы можете оптимизировать размер (вы только сериализуете то, что вам нужно), и вы можете отправить свой буфер через свою очередь.
Для сериализации вы можете использовать что-то вроде 1 байта для типа, а затем для данных. Для обработки данных переменной длины вы можете использовать от 1 до n байтов для кодирования длины данных, чтобы вы могли десериализовать данные.
Для строки:
1 байт для кодирования типа (0x01 = строка, ...)
2 байта для кодирования длины строки (если вам нужно меньше 65536 байтов)
n байтов данных
Таким образом, строка «Hello» будет сериализована как:
0x00 0x00 0x07 0x65 0x48 0x6c 0x6c
Вам нужен класс буфера и класс сериализатора / десериализатора. Затем вы делаете что-то вроде:
serialize data
send serialized data into queue
и с другой стороны
receive data
deserialize data
Надеюсь, это поможет, и я не понял вашу проблему. Часть сериализации излишня, если очереди VxWorks не такие, как я думаю ...