LINUX.ORG.RU

История изменений

Исправление tp_for_my_bunghole, (текущая версия) :

Использовать name() для сравнения типа нельзя, можно только так

typeid(*sender) == typeid(Component)

Да, потому что std::type_info::name() implementation defined, везде по своему.

Но typeid() бросает исключение std::bad_typeid если аргумент в виде *t, a t нулевой указатель. Но аргумент может быть без оператора *, просто t, и в этом случае бросать исключение или нет, различается в компиляторах. Implementation defined.

dynamic_cast может бросать исключение std::bad_cast в зависимости от вида аргумента.

В Java стандарте есть checked exceptions, компилятор видит где бросаются исключения(throws) и требует добавлять обработчики для этого.

В Object Pascal оператор as не бросает исключение если object нулевой указатель:

object as SomeClass
object as SomeInterface

Eсли типы несовместимы(Object не находится в иерархии Class или приводимый тип ниже в иерархии чем object), то бросает исключение EInvalidCast. Потому рекомендуется использовать проверку перед этим:

if Object is SomeClass then

Исходная версия tp_for_my_bunghole, :

Использовать name() для сравнения типа нельзя, можно только так

typeid(*sender) == typeid(Component)

Да, потому что std::type_info::name() implementation defined, везде по своему.

Но typeid() бросает исключение std::bad_typeid если аргумент в виде *t, a t нулевой указатель. Но аргумент может быть без оператора *, просто t, и в этом случае бросать исключение или нет, различается в компиляторах. Implementation defined.

dynamic_cast может бросать исключение std::bad_cast в зависимости от вида аргумента.

В Java стандарте есть checked exceptions, компилятор видит где бросаются исключения(throws) и требует добавлять обработчики для этого.

В Object Pascal оператор as не бросает исключение если object нулевой указатель:

object as Class
object as Interface

Eсли типы несовместимы(Object не находится в иерархии Class или приводимый тип ниже в иерархии чем object), то бросает исключение EInvalidCast. Потому рекомендуется использовать проверку перед этим:

if Object is Class then