Ранее я работал с API activemqcpp в нескольких проектах, но я всегда знал, какой тип сообщения, заранее, поэтому динамическое приведение к соответствующему подклассу сообщений было безопасным.
Сейчас я создаю оболочку для библиотеки MQ и не могу найти способ распознать из базового указателя сообщения (возвращаемого при получении), какому подклассу сообщения он соответствует, чтобы привести его соответственно.
Если вы хотите делать вещи чистым способом C ++, вы можете поиграть с использованием оператора typeid из RTTI C ++, чтобы проверить объект, чтобы увидеть, что это такое.
Более простой способ — привести к базовому типу сообщения, из которого получены все экземпляры сообщения CMS:
activemq::core::commands::Message
Этот класс предлагает метод getDataStructureType()
методы, которые возвращают тип через назначенный идентификатор, используемый в протоколе OpenWire:
const unsigned char ID_ACTIVEMQBLOBMESSAGE = 29;
const unsigned char ID_ACTIVEMQBYTESMESSAGE = 24;
const unsigned char ID_ACTIVEMQMAPMESSAGE = 25;
const unsigned char ID_ACTIVEMQMESSAGE = 23;
const unsigned char ID_ACTIVEMQOBJECTMESSAGE = 26;
const unsigned char ID_ACTIVEMQSTREAMMESSAGE = 27;
const unsigned char ID_ACTIVEMQTEXTMESSAGE = 28;
Или вы можете просто попробовать динамическое приведение к каждому типу, пока результат не станет нулевым.
Других решений пока нет …