Понимание Boost :: any с параметрами функции, указателями и правильным приведением - PullRequest
1 голос
/ 25 февраля 2020

У меня есть фундаментальное понимание использования 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.

Заранее спасибо, нападающий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...