瀏覽代碼

meta: non-const meta_any::operator*

skypjack 2 周之前
父節點
當前提交
fc4605a6b2
共有 1 個文件被更改,包括 9 次插入2 次删除
  1. 9 2
      src/entt/meta/meta.hpp

+ 9 - 2
src/entt/meta/meta.hpp

@@ -184,7 +184,7 @@ class meta_any {
         }
         }
 
 
         if constexpr(is_meta_pointer_like_v<Type>) {
         if constexpr(is_meta_pointer_like_v<Type>) {
-            if(req == internal::meta_traits::is_pointer_like) {
+            if(!!(req & internal::meta_traits::is_pointer_like)) {
                 if constexpr(std::is_function_v<typename std::pointer_traits<Type>::element_type>) {
                 if constexpr(std::is_function_v<typename std::pointer_traits<Type>::element_type>) {
                     static_cast<meta_any *>(other)->emplace<Type>(any_cast<Type>(value.storage));
                     static_cast<meta_any *>(other)->emplace<Type>(any_cast<Type>(value.storage));
                 } else if constexpr(!std::is_void_v<std::remove_const_t<typename std::pointer_traits<Type>::element_type>>) {
                 } else if constexpr(!std::is_void_v<std::remove_const_t<typename std::pointer_traits<Type>::element_type>>) {
@@ -609,12 +609,19 @@ public:
      * @return A wrapper that shares a reference to an unmanaged object if the
      * @return A wrapper that shares a reference to an unmanaged object if the
      * wrapped element is dereferenceable, an invalid meta any otherwise.
      * wrapped element is dereferenceable, an invalid meta any otherwise.
      */
      */
-    [[nodiscard]] meta_any operator*() const noexcept {
+    [[nodiscard]] meta_any operator*() noexcept {
         meta_any ret{meta_ctx_arg, *ctx};
         meta_any ret{meta_ctx_arg, *ctx};
         if(*this) { vtable(internal::meta_traits::is_pointer_like, *this, &ret); }
         if(*this) { vtable(internal::meta_traits::is_pointer_like, *this, &ret); }
         return ret;
         return ret;
     }
     }
 
 
+    /*! @copydoc operator* */
+    [[nodiscard]] meta_any operator*() const noexcept {
+        meta_any ret{meta_ctx_arg, *ctx};
+        if(*this) { vtable(internal::meta_traits::is_pointer_like | internal::meta_traits::is_const, *this, &ret); }
+        return ret;
+    }
+
     /*! @copydoc any::operator bool */
     /*! @copydoc any::operator bool */
     [[nodiscard]] explicit operator bool() const noexcept {
     [[nodiscard]] explicit operator bool() const noexcept {
         return !(vtable == nullptr);
         return !(vtable == nullptr);