昔、私は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);
}
しかし、コンパイラは、私は別の参照への参照をキャストしていたときに、このオーバーロードを使用していないようです:だけでなく、ポインタではなく、参照していないだけで動作しますバリアントを作成します。私は、理由を理解するのに十分なテンプレート解決規則を理解していないか、または動作するバリアントを作成できるようにするのは怖いです。
注:このプロジェクトでは例外が無効になっているため、dynamic_cast<Type *>
にNULLを設定する代わりにbad_cast exception
をキャッチすることはできません。
あなたは 'のSourceTypeの*'のための過負荷を追加して、オリジナルのものを引退することができますか?あなたは値の型をまったくサポートする必要がありますか? (そして、それは問題を解決します、私は今疑問に思っていますか?) –
私はこれらのコード行について考えました。なぜそれが必要なのか理解できません。動的キャストを使用して静的キャストをチェックすると、オブジェクトのみをチェックできるだけでなく、静的キャストはダイナミックキャスト可能です。それは 'dynamic_cast'の再実装です。動的キャストと静的キャストの違いは、動的キャストがvtableと静的キャストを調べていないことです。 – nutario
これは静的なキャストですが、キャストしているタイプについての仮定が間違っていることをデバッグ時間として通知します。 – Suma