diff options
author | Fabio Alessandrelli <fabio.alessandrelli@gmail.com> | 2023-01-10 14:28:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-10 14:28:26 +0100 |
commit | 8ee9cab8f87dc1c09fe1f85eb632dac46a395c72 (patch) | |
tree | 549c1461e7d19c97e3531b3708ff6090cd167d8c /include/godot_cpp/core/binder_common.hpp | |
parent | 129c358a72ff7baad0ca1e03ddaad96564de239a (diff) | |
parent | 9fd33b5cdedd214f6defc89049f520770e164260 (diff) | |
download | redot-cpp-8ee9cab8f87dc1c09fe1f85eb632dac46a395c72.tar.gz |
Merge pull request #989 from Faless/ext/4.x_objects_bind
Allow method binds to take Object subclasses as arguments
Diffstat (limited to 'include/godot_cpp/core/binder_common.hpp')
-rw-r--r-- | include/godot_cpp/core/binder_common.hpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/include/godot_cpp/core/binder_common.hpp b/include/godot_cpp/core/binder_common.hpp index 642c5ba..207d3c1 100644 --- a/include/godot_cpp/core/binder_common.hpp +++ b/include/godot_cpp/core/binder_common.hpp @@ -86,21 +86,36 @@ namespace godot { template <class T> struct VariantCaster { static _FORCE_INLINE_ T cast(const Variant &p_variant) { - return p_variant; + using TStripped = std::remove_pointer_t<T>; + if constexpr (std::is_base_of<Object, TStripped>::value) { + return Object::cast_to<TStripped>(p_variant); + } else { + return p_variant; + } } }; template <class T> struct VariantCaster<T &> { static _FORCE_INLINE_ T cast(const Variant &p_variant) { - return p_variant; + using TStripped = std::remove_pointer_t<T>; + if constexpr (std::is_base_of<Object, TStripped>::value) { + return Object::cast_to<TStripped>(p_variant); + } else { + return p_variant; + } } }; template <class T> struct VariantCaster<const T &> { static _FORCE_INLINE_ T cast(const Variant &p_variant) { - return p_variant; + using TStripped = std::remove_pointer_t<T>; + if constexpr (std::is_base_of<Object, TStripped>::value) { + return Object::cast_to<TStripped>(p_variant); + } else { + return p_variant; + } } }; |