Давным-давно я создал следующий шаблон, чтобы получать утверждение всякий раз, когда я выполняю static_cast, но тип не тот, который я предполагаю:
/// perform a static_cast asserted by a dynamic_cast
template <class Type, class SourceType>
Type static_cast_checked(SourceType item)
{
Assert(!item || dynamic_cast<Type>(item));
return static_cast<Type>(item);
}
Сегодня я хотел создать вариант, который бы работал не только с указателями, но и со ссылками:
/// overload for reference
template <class Type, class SourceType>
Type &static_cast_checked(SourceType &item)
{
Assert(dynamic_cast<Type *>(&item));
return static_cast<Type>(item);
}
Однако компилятор, похоже, не использует эту перегрузку, когда я преобразовываю ссылку на другую ссылку. Боюсь, я недостаточно понимаю правила разрешения шаблонов, чтобы понять, почему, или чтобы иметь возможность создать вариант, который работает.
Примечание: я не могу поймать исключение bad_cast
вместо проверки dynamic_cast <Введите *>
для NULL, так как исключения для этого проекта отключены.