На самом деле эти броски являются очевидными признаками чего-то необычного в коде, поэтому в идеальном мире их не следует использовать.
Но в некоторых случаях они являются подходящим инструментом для работы.
Для static_cast существует в основном 2 случая:
1.Примитивное преобразование.
Когда вам действительно нужно некоторое целое число для обработки в исчислении с использованием чисел с плавающей точкой.
float ratio = static_cast<float>( pixel_pos.x ) / static_cast<float>( pixel_pos.y ); // x and y are integers because pixel positions are absolute, but we need to get a floating point value here
2.Вы получили объект из какого-то внешнего API и хотите получить конкретный дочерний тип.
Thing* thing = factory.create( "shoe" ); // Even if I don't have it's real type, I know it's a shoe!
Shoe* shoe = static_cast<Shoe*>( thing ); // I need to use Shoe interface so lets cast it.
Если вы спроектировали систему, возможно, вы могли бы сделать это лучше, чтобы избежать приведения.Но если вы этого не сделали, а используемый вами API предоставляет базовый тип для работы с ним, то у вас нет другого выбора, кроме как приведение.
static_cast также полезнопотому что это позволяет вам предполагать что-то во время компиляции, поэтому вы должны использовать это в первую очередь, потому что это требует от вас быть уверенным в том, что вы делаете.объекта.
Однако существует особый случай, когда вам нужно знать реальный тип во время выполнения, потому что вы не можете узнать его в другое время.Типичный случай, когда вы получаете какие-то объекты из внешней системы, и нет никакой другой информации о реальном типе объекта
void on_something_happen( const Event& event ) // callback triggered when an event occured in the library system this callback is plugged in
{
// here I want to manage two cases
ThingEvent* thing_event = dynamic_cast<ThingEvent*>( &event );
if( thing_event )
{
// do my thing
}
else
{
// ok this event HAVE TO be a FooEvent, otherwise this should crash
FooEvent& foo_event = dynamic_cast<FooEvent&>( event );
// do my thing
}
}