Вы можете использовать reinterpret_cast
для приведения к целочисленному типу и обратно к типу указателя. Если целочисленный тип достаточно велик для хранения значения указателя, то это преобразование не изменит значение указателя.
Как уже говорят другие, не определено поведение для использования dynamic_cast с неполиморфным классом (кроме случаев, когда вы выполняете upcast, который в любом случае неявен и игнорируется здесь), и он также работает только с указателями или ссылками. Не на целочисленных типах.
Вам лучше использовать ::intptr_t
в различных системах posix. Вы можете использовать этот тип в качестве промежуточного типа, который вы используете.
Что касается проверки успешности конвертации, вы можете использовать sizeof:
BOOST_STATIC_ASSERT(sizeof(T1) >= sizeof(T2));
потерпит неудачу во время компиляции, если преобразование не может быть выполнено. Или продолжайте использовать assert с этим условием, и оно будет утверждаться во время выполнения.
Предупреждение: Это не помешает вам привести T*
к intptr_t
обратно к U*
с U другого типа, чем T. Таким образом, это только гарантирует, что приведение не изменится значение указателя, если вы приведете от T*
к intptr_t
и обратно к T*
. (Спасибо Никола, указывая, что вы можете ожидать другую защиту).