Для ясности:
Я хотел избежать dynamic_cast
, так как это время выполнения броска.
Ну, у вас есть тип время выполнения (при статический типизированная ссылка на базовый класс, вы не можете вообще знаете динамический типа объекта), поэтому во время выполнения бросания является единственным полностью безопасным вариантом.
Если вы думали, что ваш объект действительно был в Bar
, но ошибались, dynamic_cast<Bar*>
даст вам nullptr
или dynamic_cast<Bar&>
сгенерирует исключение. В любом случае у вас есть возможность справиться со своей ошибкой во время выполнения во время выполнения. Как указывал M.M, это доступно только в том случае, если ваш базовый класс имеет или наследует хотя бы один виртуальный метод.
Теперь, если, случайно, вы можете быть статический определенными динамическим типом вашего объекта действительно являетсяBar
, вы можете использовать static_cast
. Однако, если вы ошибаетесь, у вас есть Undefined Behavior и нет возможности обнаружить или обработать ошибку.
например.
struct Foo { virtual ~Foo(){} };
struct Bar : public Foo {};
// safe, may return nullptr
Bar* safe_ptr_cast(Foo *f) { return dynamic_cast<Bar*>(f); }
// safe, may throw but you can catch it
Bar& safe_ref_cast(Foo &f) { return dynamic_cast<Bar&>(f); }
// unsafe - if you're wrong, you just broke everything
Bar* unsafe_ptr_cast(Foo *f) { return static_cast<Bar*>(f); }
Кстати, если ваша проблема с временем запуска броском производительность, рискуя UB, чтобы сэкономить условное время, прежде чем у вас есть код для профилирования является определением преждевременной оптимизации.
Это то, чего вам следует избегать, делая такие вещи, является признаком проблем дизайна. Если вы считаете, что вам действительно нужно это, вы можете сравнить типы типов классов, и если это соответствует, вы можете static_cast указатель ...это быстрее, чем dynamic_cast, но не будет работать, если вы не знаете точный целевой класс. – Melkon
@Melkon, как проверять typeid быстрее, чем dynamic_cast? Какой компилятор и настройки вы видели? –
@MarkRansom: проверка типа не пересекает иерархию классов. – Melkon