Ограничение интерфейса заставляет меня отличать MyObject*
в void*
, используя static_cast. При возврате этого указателя к последующим вызовам интерфейса, я должен выполнить еще один static_cast от void*
до MyObject*
, потому что dynamic_cast не будет работать в этом случае (пояснил here).Любой способ выполнить проверку безопасности типа после static_cast?
Тем не менее, я хотел бы выполнить проверку безопасности типа, чтобы избежать каких-либо странных событий, если кто-то другой изменит части кода. Если есть какие-либо проверки, которые могут быть выполнены в этих условиях, какой из них был бы лучшим/наиболее удобным?
Нет, вам не нужно использовать 'static_cast' для преобразования' MyObject * 'в' void * '. Это неявное преобразование. Да, вам нужно использовать 'static_cast', чтобы вернуться из этого' void * 'в ваш' MyObject * '. –
Кодовые комментарии, показывающие связь между передачей обратного вызова и функцией обратного вызова, обычно достаточно, чтобы напоминать сопровождающим об обновлении информации о типе. Если люди сильно ошибаются в вашем коде, напишите сценарии для запуска во время сборки, чтобы проверить соответствующие типы. –
Вы также можете использовать систему типов, чтобы гарантировать это, создав typedef для каждого обратного вызова и используя это с обеих сторон. Предположим, что у вас есть функция 'async_lookup', вы можете объявить' typedef DictionaryEntry async_lookup_cb_type' –