Давным-давно я создал следующий шаблон, чтобы я получал подтверждение всякий раз, когда выполняю 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 exception
вместо проверки dynamic_cast<Type *>
на NULL, поскольку исключения для этого проекта отключены.