2015-04-17 5 views
1

Я планирую прочитать тип T из поля байтов, заданной void* следующим образом:Чтение из поля байтов недействительными * и reinterpret_cast

template <class T> 
T read(void* ptr){ 
    return reinterpret_cast<T>(*ptr); 
} 

Но я получаю некоторые сомнения: Что разыменовывая void* на самом деле дать в reinterpret_cast<T>? Просто байт в этом положении? Или «магически» последовательность байтов длины T? Должен ли я сначала наложить void* на T*?

ответ

5

Вы не можете разыменовывать указатель на пустоту, он не указывает на объект. Но стандарт C диктует, что:

Указатель на void может быть преобразован в указатель или с какого-либо указателя на любой тип объекта.

Мы можем сначала преобразовать ptr к T* и затем разыменовать него:

template <class T> 
T read(void* ptr) { 
    return *static_cast<T*>(ptr); 
} 
+0

Не знаю, что с указателем ничтожной, но делает конечно идеальный смысл! Спасибо за Ваш ответ. – Michael