diff --git a/src/blackmisc/valueobject.h b/src/blackmisc/valueobject.h index b959a7fb3..41053ede0 100644 --- a/src/blackmisc/valueobject.h +++ b/src/blackmisc/valueobject.h @@ -362,13 +362,13 @@ namespace BlackMisc //! Virtual method to return QVariant, used with DBus QVariant lists virtual QVariant toQVariant() const { - return maybeToQVariant(); + return Private::MetaTypeHelper::maybeToQVariant(*derived()); } //! Set from QVariant virtual void convertFromQVariant(const QVariant &variant) { - return maybeConvertFromQVariant(variant); + Private::MetaTypeHelper::maybeConvertFromQVariant(*derived(), variant); } //! Set property by index @@ -413,7 +413,7 @@ namespace BlackMisc //! Returns the Qt meta type ID of this object. virtual int getMetaTypeId() const { - return maybeGetMetaTypeId(); + return Private::MetaTypeHelper::maybeGetMetaTypeId(); } /*! @@ -445,44 +445,6 @@ namespace BlackMisc private: const Derived *derived() const { return static_cast(this); } Derived *derived() { return static_cast(this); } - - // fallbacks in case Derived is not a registered meta type - - template ::Defined>::type* = nullptr> - static int maybeGetMetaTypeId() - { - return QMetaType::UnknownType; - } - - template ::Defined>::type* = nullptr> - static int maybeGetMetaTypeId() - { - return qMetaTypeId(); - } - - template ::Defined>::type* = nullptr> - QVariant maybeToQVariant() const - { - return {}; - } - - template ::Defined>::type* = nullptr> - QVariant maybeToQVariant() const - { - return QVariant::fromValue(*derived()); - } - - template ::Defined>::type* = nullptr> - void maybeConvertFromQVariant(const QVariant &variant) - { - Q_UNUSED(variant); - } - - template ::Defined>::type* = nullptr> - void maybeConvertFromQVariant(const QVariant &variant) - { - BlackMisc::setFromQVariant(derived(), variant); - } }; } // namespace diff --git a/src/blackmisc/valueobject_private.h b/src/blackmisc/valueobject_private.h index b30b65841..bee0915d0 100644 --- a/src/blackmisc/valueobject_private.h +++ b/src/blackmisc/valueobject_private.h @@ -127,6 +127,28 @@ namespace BlackMisc //! \private Getter to obtain the IValueObjectMetaInfo which was stored by BlackMisc::registerMetaValueType. template IValueObjectMetaInfo *getValueObjectMetaInfo() { return getValueObjectMetaInfo(qMetaTypeId()); } + + //! \private + template + struct MetaTypeHelperImpl + { + static Q_DECL_CONSTEXPR int maybeGetMetaTypeId() { return qMetaTypeId(); } + static QVariant maybeToQVariant(const T &obj) { return QVariant::fromValue(obj); } + static void maybeConvertFromQVariant(T &obj, const QVariant &var) { BlackMisc::setFromQVariant(&obj, var); } + }; + + //! \private + template + struct MetaTypeHelperImpl + { + static Q_DECL_CONSTEXPR int maybeGetMetaTypeId() { return QMetaType::UnknownType; } + static QVariant maybeToQVariant(const T &) { return {}; } + static void maybeConvertFromQVariant(T &, const QVariant &) {} + }; + + //! \private + template + using MetaTypeHelper = MetaTypeHelperImpl::Defined>; } }