#ifndef SLANG_CORE_TYPE_TRAITS_H #define SLANG_CORE_TYPE_TRAITS_H namespace Slang { struct TraitResultYes { char x; }; struct TraitResultNo { char x[2]; }; template struct IsBaseOfTraitHost { operator B*() const { return nullptr; } operator D*() { return nullptr; } }; template struct IsBaseOf { template static TraitResultYes Check(D*, T) { return TraitResultYes(); } static TraitResultNo Check(B*, int) { return TraitResultNo(); } enum { Value = sizeof(Check(IsBaseOfTraitHost(), int())) == sizeof(TraitResultYes) }; }; template struct EnableIf { }; template struct EnableIf { typedef T type; }; template struct IsConvertible { static TraitResultYes Use(B) { return TraitResultYes(); }; static TraitResultNo Use(...) { return TraitResultNo(); }; enum { Value = sizeof(Use(*(D*)(nullptr))) == sizeof(TraitResultYes) }; }; } // namespace Slang #endif