Если dynamic_cast
должен успешен, было бы неплохо использовать boost::polymorphic_downcast
вместо этого, что выглядит примерно так:
assert(dynamic_cast<T*>(o) == static_cast<T*>(o));
return static_cast<T*>(o);
Таким образом, вы будете обнаруживать ошибки в отладочной сборке, в то же время избегая накладных расходов времени выполнения в сборке выпуска.
Если вы подозреваете, что приведение может завершиться неудачей, и вы хотите его обнаружить, используйте dynamic_cast
и приведите к ссылочному типу. Это приведение бросит bad_cast
в случае ошибки и закроет вашу программу. (Это хорошо, если, как вы говорите, вы все равно не восстановитесь)
T& t = dynamic_cast<T&>(o);
t.func(); //< Use t here, no extra check required
Используйте dynamic_cast
для типа указателя, только если 0-указатель имеет смысл в контексте. Возможно, вы захотите использовать его в if
, например так:
if (T* t = dynamic_cast<T*>(o)) {
t->func(); //< Use t here, it is valid
}
// consider having an else-clause
С помощью этой последней опции вам нужно убедиться, что путь выполнения имеет смысл, если dynamic_cast
возвращает 0.
Чтобы ответить на ваш вопрос напрямую: я бы предпочел одну из двух первых альтернатив, которые я дал, чтобы иметь явный assert
в коде:)