2017-01-30 5 views
0

Ограничение интерфейса заставляет меня отличать MyObject* в void*, используя static_cast. При возврате этого указателя к последующим вызовам интерфейса, я должен выполнить еще один static_cast от void* до MyObject*, потому что dynamic_cast не будет работать в этом случае (пояснил here).Любой способ выполнить проверку безопасности типа после static_cast?

Тем не менее, я хотел бы выполнить проверку безопасности типа, чтобы избежать каких-либо странных событий, если кто-то другой изменит части кода. Если есть какие-либо проверки, которые могут быть выполнены в этих условиях, какой из них был бы лучшим/наиболее удобным?

+0

Нет, вам не нужно использовать 'static_cast' для преобразования' MyObject * 'в' void * '. Это неявное преобразование. Да, вам нужно использовать 'static_cast', чтобы вернуться из этого' void * 'в ваш' MyObject * '. –

+0

Кодовые комментарии, показывающие связь между передачей обратного вызова и функцией обратного вызова, обычно достаточно, чтобы напоминать сопровождающим об обновлении информации о типе. Если люди сильно ошибаются в вашем коде, напишите сценарии для запуска во время сборки, чтобы проверить соответствующие типы. –

+0

Вы также можете использовать систему типов, чтобы гарантировать это, создав typedef для каждого обратного вызова и используя это с обеих сторон. Предположим, что у вас есть функция 'async_lookup', вы можете объявить' typedef DictionaryEntry async_lookup_cb_type' –

ответ

1

Нет, после того, как вы нанесли void*, все дело в коде, чтобы получить отличные результаты. Основной причиной является то, что void* вы получите обратно теоретически можно указать на почти что угодно: char, int, std::string, std::complex<double>, std::map<int, int>::iterator и конечно MyObject.

Проблема, с которой вы столкнетесь, заключается в том, что ваш бросок будет работать только в том случае, если void* фактически указывает на MyObject, но в этом случае бросок не нужен в любом случае.

Не-литейный обходной путь, чтобы сохранить std::unordered_set<void*> из всех void* вы создали литье MyObject*, удаление истекших указателей с помощью ~MyObject() и проверок того, что набор перед заливкой.

+0

Вы явно правы в этом, но разве нет способа выполнить проверку типа после static_cast от 'void *' до 'MyObject *'? В genral это означает, что мне нужно будет проверить, действительно ли объект имеет тип, который, как он есть. – Migsi

+0

@Migsi: Нет. Есть 3 случая для рассмотрения: проверка прошла, проверка не выполнена, неопределенное поведение. Попытка «static_cast » может привести только к проверке или UB, и как только вы нажмете UB, вы не можете отменить это. Таким образом, результат проверки невозможен. – MSalters

 Смежные вопросы

  • Нет связанных вопросов^_^