Плохое приведение обычно указывает на ошибку в программе (например, вне диапазона или нехватки памяти), и, следовательно, не должно быть обнаружено вообще (или, возможно, на верхнем уровне).Если вы хотите выполнить ветвление в случае успеха dynamic_cast
, тогда проверьте на нулевое значение в форме указателя:
if (T* p = dynamic_cast<T*>(some_ptr))
{
// Do something with p
}
Если вам нужен специальный обработчик, лучшее, что вы можете сделать, это, таким образом, следующее:
template <typename T, typename U>
T& polymorphic_cast(U& x)
{
if (T* p = dynamic_cast<T*>(&x)) return *p;
my_handler();
}
где my_handler
должен убить программу (и, возможно, зарегистрировать ошибку).Но здесь вы можете использовать простую форму dynamic_cast<T&>
, позволить std::bad_cast
всплыть и войти в систему на верхнем уровне.Это также лучше работает с отладчиками, которые можно настроить так, чтобы они останавливались в точке сбоя приведения.
Случаи, которые вы описываете в своих комментариях, достаточно редки, чтобы заслуживать особого рассмотрения, например ::
if (auto p = dynamic_cast<foo*>(q)) { do_something(); }
else { throw bail_me_out_of_here(); }
может использоваться для указания стратегу, работающему в верхнем течении, что ему следует попробовать другой метод.