У меня есть фундаментальное понимание использования boost :: any, но я унаследовал некоторый код, который озадачивает меня. Я пытаюсь понять реализацию и есть ли лучший / правильный способ реализации.
По сути, у меня есть ряд функций, которые будут форматировать int16, int32, строковые или векторные данные, используемые в сочетании с Последовательный интерфейс, который (1) записывает данные программы из последовательного интерфейса или (2) считывает данные из последовательного интерфейса в память программы.
Для простоты я упустил все. Вот главная ().
boost::any localData;
std::vector<uint8_t> serialBuffer(MAX_BUFFER_SIZE,0);
// First use: read serial buffer: convert first four bytes to int32
readSerialData(serialBuffer.data());
formatDataInt32(FROM_SERIAL, &localData, serialBuffer.data());
// :
//Second use: write to serial buffer: convert int32 to serial bytes
localData = (uint32_t)(0x11223344);
formatDataInt32(TO_SERIAL, &localData, serialBuffer.data());
writeSerialData(serialBuffer.data());
Вот пример функции форматирования:
void formatDataInt32(int direction, boost::any *plocal, uint8_t *pserial) {
if (direction == FROM_SERIAL) {
// Looking for a solution using either of these instead of *plocal.
//uint32_t *plocalInt32 =
//boost::any *pboostInt32 =
*plocal = (uint32_t) ((pserial[0] << 24) | (pserial[1] << 16) | (pserial[2] << 8) | pserial[3]);
}
else if (direction == FROM_SERIAL) {
; // not worried about this implementation
}
else {
; // unsupported
}}
Это работает при установке localData в основной программе. , ,
*plocal = (uint32_t) ((pserial[0] << 24) | (pserial[1] << 16) | (pserial[2] << 8) | pserial[3]);
Но могу ли я выполнить sh то же самое, используя * plocalInt32, * pboostInt32, или что-то подобное при преобразовании с помощью * pLocal? Если так, то как?
Я пробовал ряд синтаксисов. Я получил ошибки компиляции, ошибки boost :: bad_any_cast и ошибки памяти.
Использование boost :: any * pLocal в качестве второго параметра кажется неправильным. Кажется, что boost :: any pLocal может быть правильным.
Есть ли проблема в том, что localData не инициализируется значением 'dummy' соответствующего типа? Я думал, что прочитал о проблемах, используя boost :: any_cast, если переменная boost :: any не напечатана.
Это случай (с рисками) для использования boost :: unsafe_any_cast?
Использование * Покал работает. Но я хочу лучше понять boost :: any.
Заранее спасибо, нападающий.