From f533bb6a14c37f1d08cd43325a3158e00f06df1d Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Fri, 22 Aug 2025 14:37:16 +0800 Subject: [PATCH] =?UTF-8?q?Trait=E5=A2=9E=E5=BC=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- detail/CP/Typen.hpp | 93 +++++++++++++++++++++++++++++++++------------ 1 file changed, 68 insertions(+), 25 deletions(-) diff --git a/detail/CP/Typen.hpp b/detail/CP/Typen.hpp index a3df7ea..de3002a 100644 --- a/detail/CP/Typen.hpp +++ b/detail/CP/Typen.hpp @@ -255,7 +255,8 @@ namespace Internal return name; } - template struct TraitTool + template struct TraitTool; + template struct TraitTool { template static constexpr bool Is() { return (TAreSame || (Derived && TIsBaseOf)); } template static constexpr bool Is(P) { return (TAreSame || (Derived && TIsBaseOf)); } @@ -440,11 +441,6 @@ namespace Internal { return SymbolNameTool(); } - template - constexpr static std::string_view ValueName() - { - return ValueNameTool(); - } static uint32_t Hash(const T& v) { @@ -462,27 +458,74 @@ namespace Internal public: constexpr static int TypeHash = InjectTypeHash(); }; - template struct TraitTool : public TraitTool {}; - template struct TraitTool< volatile T> : public TraitTool {}; - template struct TraitTool : public TraitTool {}; + template struct TraitTool : public TraitTool + { + template + constexpr static std::string_view ValueName() + { + return ValueNameTool(); + } + }; + template struct TraitTool : public TraitTool {}; + template struct TraitTool< volatile T, IsIntegral> : public TraitTool {}; + template struct TraitTool : public TraitTool {}; } -template using TTrait = Internal::TraitTool; -using Bool = Internal::TraitTool; -using Int = Internal::TraitTool; -using Float = Internal::TraitTool; -using Double = Internal::TraitTool; -using Long = Internal::TraitTool; -using UInt = Internal::TraitTool; -using Int8 = Internal::TraitTool; -using Int16 = Internal::TraitTool; -using Int32 = Internal::TraitTool; -using Int64 = Internal::TraitTool; -using UInt8 = Internal::TraitTool; -using UInt16 = Internal::TraitTool; -using UInt32 = Internal::TraitTool; -using UInt64 = Internal::TraitTool; -using LongDouble = Internal::TraitTool; +template using TTrait = Internal::TraitTool>; + +namespace Internal +{ + template class ValueClass : public TTrait + { + private: + T value; + using _Mybase = TTrait; + public: + ValueClass(const T& value) : value(value) {} + ValueClass(T& value) : value(value) {} + ValueClass(T&& value) : value(std::move(value)) {} + ValueClass& operator=(const T& value) noexcept + { + this->value = value; + } + ValueClass& operator=(T& value) noexcept + { + this->value = value; + } + ValueClass& operator=(T&& value) noexcept + { + this->value = std::move(value); + } + constexpr operator T& () + { + return value; + } + constexpr operator const T& () const + { + return value; + } + uint32_t Hash() + { + return _Mybase::Hash(value); + } + }; +} + +using Bool = Internal::ValueClass; +using Int = Internal::ValueClass; +using Float = Internal::ValueClass; +using Double = Internal::ValueClass; +using Long = Internal::ValueClass; +using UInt = Internal::ValueClass; +using Int8 = Internal::ValueClass; +using Int16 = Internal::ValueClass; +using Int32 = Internal::ValueClass; +using Int64 = Internal::ValueClass; +using UInt8 = Internal::ValueClass; +using UInt16 = Internal::ValueClass; +using UInt32 = Internal::ValueClass; +using UInt64 = Internal::ValueClass; +using LongDouble = Internal::ValueClass; #if !defined(nameofT)&&!defined(nameofEnum) template constexpr auto __Inject_nameof()