Я согласен с другими постами: это почти наверняка не то, что вы намереваетесь делать.
Однако , IIRC, вы гарантированы стандартом C ++, чтобы иметь возможность преобразовывать указатель любого типа (не включая указатели на функции или элементы) в unsigned char *
или void *
и обратно без входа в царство неопределенного поведения. Кроме того, вы можете получить доступ к любому объекту через lvalue типа char *
или unsigned char *
(см. ISO 14882: 2003 раздел 3.10.15). Я использовал это раньше для проверки внутреннего представления произвольных типов объектов. В результате, если мое прочтение стандарта правильно, это приводит к «поведению, определяемому реализацией» (очевидно, внутреннее представление типов зависит от реализации).
Например,
template<class T> std::vector<unsigned char> to_bytes (const T& t)
{
const unsigned char *p = reinterpret_cast<const unsigned char *>(&t);
return std::vector<unsigned char>(p, p + sizeof(T));
}
- это шаблонная функция, которая выдаст std::vector<unsigned_char>
, которая является копией внутреннего представления объекта.
Однако тот факт, что вы возвращаетесь к void *
, когда возвращаетесь, заставляет меня подозревать, что вы делаете что-то более сомнительное и более неопределенное.