Мы можем предположить, что буфер аргумента < /code> «обычно» удерживает объект данного типа, но мне нужен диагностический (проверка утверждения) против возможных ошибок. < /p>
Код: Выделить всё
template
T* get_object_from_buffer(std::uint8_t* buffer, std::size_t size)
{
// This constraint was missing in original version of the question.
if (size != sizeof(T))
{
// Invalid usage of the function.
return nullptr;
}
void* tmp_buffer = buffer;
if (nullptr != std::align( alignof(T),
sizeof(T),
tmp_buffer,
size ) )
{
return reinterpret_cast(buffer);
}
else
{
// Caller can check returned pointer to implement diagnostic reactions
return nullptr;
}
}
[*] разрешено (и портативно) делать это с помощью std :: align ? /> Условия: < /p>
- Функция будет использоваться в встроенной системе.
Следовательно, некоторые хиты Google для std :: Выравнивание на платформах ПК не применимы. < /p>
< /li>
буфериМежду функциями put/get, я должен пройти буфер через библиотеку, которая не являетсяКод: Выделить всё
template std::pair put_object_into_buffer(T* object) { return std::pair( reinterpret_cast(object), sizeof(object) ); }
, знакомы с определенными пользователями типами, такими как t .
Подробнее здесь: https://stackoverflow.com/questions/782 ... en-pointer
Мобильная версия