fix nameof_type

This commit is contained in:
neargye 2019-12-02 14:17:48 +05:00
parent ed639692b5
commit fa938cff96

View file

@ -554,6 +554,7 @@ constexpr auto n() noexcept {
# elif defined(_MSC_VER) # elif defined(_MSC_VER)
constexpr std::string_view name{__FUNCSIG__ + 63, sizeof(__FUNCSIG__) - 81 - (__FUNCSIG__[sizeof(__FUNCSIG__) - 19] == ' ' ? 1 : 0)}; constexpr std::string_view name{__FUNCSIG__ + 63, sizeof(__FUNCSIG__) - 81 - (__FUNCSIG__[sizeof(__FUNCSIG__) - 19] == ' ' ? 1 : 0)};
# endif # endif
static_assert(name.size() > 0, "Type does not have a name.");
return cstring<name.size()>{name}; return cstring<name.size()>{name};
#else #else
@ -562,6 +563,9 @@ constexpr auto n() noexcept {
#endif #endif
} }
template <typename... T>
inline constexpr auto type_name_v = n<T...>();
} // namespace nameof::detail } // namespace nameof::detail
// Checks is nameof_type supported compiler. // Checks is nameof_type supported compiler.
@ -588,28 +592,22 @@ template <auto V>
// Obtains string name of type, reference and cv-qualifiers are ignored. // Obtains string name of type, reference and cv-qualifiers are ignored.
template <typename T> template <typename T>
[[nodiscard]] constexpr auto nameof_type() noexcept { [[nodiscard]] constexpr std::string_view nameof_type() noexcept {
#if defined(_MSC_VER) #if defined(_MSC_VER)
constexpr auto name = detail::n<detail::identity<detail::remove_cvref_t<T>>>(); return detail::type_name_v<detail::identity<detail::remove_cvref_t<T>>>;
#else #else
constexpr auto name = detail::n<detail::remove_cvref_t<T>>(); return detail::type_name_v<detail::remove_cvref_t<T>>;
#endif #endif
static_assert(name.size() > 0, "Type does not have a name.");
return name;
} }
// Obtains string name of full type, with reference and cv-qualifiers. // Obtains string name of full type, with reference and cv-qualifiers.
template <typename T> template <typename T>
[[nodiscard]] constexpr auto nameof_full_type() noexcept { [[nodiscard]] constexpr std::string_view nameof_full_type() noexcept {
#if defined(_MSC_VER) #if defined(_MSC_VER)
constexpr auto name = detail::n<detail::identity<T>>(); return detail::type_name_v<detail::identity<T>>;
#else #else
constexpr auto name = detail::n<T>(); return detail::type_name_v<T>;
#endif #endif
static_assert(name.size() > 0, "Type does not have a name.");
return name;
} }
} // namespace nameof } // namespace nameof