самого безопасного, переносимого способа для преобразования POD (т.е.C совместимые структуры) типы беззнакового указателей гольцов не используя reinterpret_cast
, но с помощью static_cast
(C++ 0x исправляет это и дает reinterpret_cast однозначно имеют ту же портативную семантику, следующая строка коды):
unsigned char *uc_ptr2 = static_cast<unsigned char*>(static_cast<void*>(uc_ptr));
Но для всех практических целей, хотя стандарт C++ 03 считается несколько неоднозначным в этой проблеме (не столько при преобразовании указателей типов классов, но при преобразовании указателей неклассических типов в «unsigned char *») , большинство реализаций будут поступать правильно, если вы используете reinterpret_cast
следующим образом:
unsigned char *uc_ptr2 = reinterpret_cast<void*>(uc_ptr);
Я подозреваю, что с вашими проблемами выравнивания должно быть хорошо, так как ваша структура содержит неподписанные символы, которые могут быть выровнены в любом байте, поэтому компилятор не будет вставлять какую-либо упаковку между членами (но, строго говоря, это зависит от реализации, поэтому используйте осторожность).
Спасибо Джону за редактирование. Я не поймал этого, набирая торопливость. – Jared
В примере, который вы указали при использовании броска, должен быть dynamic_cast <>, поскольку существует отношение наследования. static_cast <> может использоваться с несвязанными (с точки зрения отношения наследования) для преобразования, например, целого числа в тип перечисления, double в int ... –
@ Jared - вы можете использовать static_cast здесь - см. мой ответ. @dribeas - здесь не работает static_cast - динамический_cast на самом деле не будет работать здесь, поскольку в базе нет виртуальных функций, но если бы существовал виртуальный деструктор - можно было бы использовать одну из приведений - static_cast будет больше конечно, хотя dynamic_cast имеет определенные преимущества во время выполнения (не требуется в этом сценарии). –