Есть ли альтернатива dynamic_cast в c ++? - PullRequest
1 голос
/ 24 октября 2019

Я хотел бы знать это в случае, если RTTI отключен в некоторой среде компилятора.

Вариант использования:

Я использовал это в своем коде, и это работало на моей машине, но во время тестирования интеграциикод не работал должным образом, скорее всего, произошел сбой.

Я предполагал, что он вернул бы ноль в случае отсутствия RTTI, который был обработан в моем коде, но поведение было неожиданным.

Что я должен был проверить, чтобы элегантно завершить его?

Кроме того, когда я использовал оболочку dynamic_cast (определенную в нашей внутренней структуре), она работала нормально. Какого рода реализация должна выполнять эта оболочка для выполнения этого требования?

1 Ответ

0 голосов
/ 24 октября 2019

Раймонд Чен оставил невероятную ссылку в комментарии о том, как определить, включен ли RTTI.

Чтобы завершить это, вы можете переопределить dynamic_cast с помощью:

#if !defined(RTTI_ENABLED)
    #define dynamic_cast _NullPtrTFn
#endif

template <typename T1, typename T2>
T1* _NullPtrTFn(T2* p)
{
    static_cast<T1*>(p); // try fail to compile (https://godbolt.org/z/hcjKki)
    return static_cast<T1*>(nullptr);
}
...