Проверено статическое приведение по ссылке

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

5
задан Suma 29 November 2010 в 20:06
поделиться