#pragma once #include template bool is_a(TBase* t) { assert(t != nullptr); return T::IsInstance(t); } template bool is_a_nullable(TBase* t) { if (t) { return is_a(t); } else { return false; } } template T* dyn_cast(TBase* t) { assert(t != nullptr); if (T::IsInstance(t)) { return static_cast(t); } else { return nullptr; } } template const T* dyn_cast(const TBase* t) { assert(t != nullptr); if (T::IsInstance(t)) { return static_cast(t); } else { return nullptr; } } template T* dyn_cast_nullable(TBase* t) { if (!t) return nullptr; return dyn_cast(t); }