#pragma once #include #include #include #include namespace sc { template constexpr static std::integral_constant int_{}; template constexpr static std::integral_constant uint_{}; template constexpr static std::integral_constant bool_{}; template constexpr static std::integral_constant char_{}; template requires std::is_enum_v constexpr static std::integral_constant enum_{}; template struct type_name { constexpr explicit type_name(T) {} constexpr type_name() = default; }; template constexpr static type_name type_{}; template struct string_constant; inline namespace literals { template CONSTEVAL auto operator""_sc() { return stdx::ct_string_to_type(); } } // namespace literals template concept sc_like = requires(T const &t) { t.apply([](StringType, auto const &...) {}); }; } // namespace sc using sc::literals::operator""_sc;