From 02c8bfff69e06bfe47af92f650a744d05e6be7b9 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Fri, 17 Jan 2025 00:05:22 +0100 Subject: [PATCH] Add constraints to templates in BaseClass using static_asserts --- src/Base/BaseClass.h | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Base/BaseClass.h b/src/Base/BaseClass.h index df658b6513..33d7ced2f2 100644 --- a/src/Base/BaseClass.h +++ b/src/Base/BaseClass.h @@ -156,16 +156,10 @@ public: } template - bool is() const - { - return getTypeId() == T::getClassTypeId(); - } + bool is() const; template - bool isDerivedFrom() const - { - return getTypeId().isDerivedFrom(T::getClassTypeId()); - } + bool isDerivedFrom() const; private: static Type classTypeId; // NOLINT @@ -187,6 +181,20 @@ public: virtual ~BaseClass(); }; +template +bool BaseClass::is() const +{ + static_assert(std::is_base_of::value, "T must be derived from Base::BaseClass"); + return getTypeId() == T::getClassTypeId(); +} + +template +bool BaseClass::isDerivedFrom() const +{ + static_assert(std::is_base_of::value, "T must be derived from Base::BaseClass"); + return getTypeId().isDerivedFrom(T::getClassTypeId()); +} + /** * Template that works just like dynamic_cast, but expects the argument to * inherit from Base::BaseClass. @@ -195,6 +203,8 @@ public: template T* freecad_dynamic_cast(Base::BaseClass* type) { + static_assert(std::is_base_of::value, "T must be derived from Base::BaseClass"); + if (type && type->isDerivedFrom(T::getClassTypeId())) { return static_cast(type); } @@ -210,6 +220,8 @@ T* freecad_dynamic_cast(Base::BaseClass* type) template const T* freecad_dynamic_cast(const Base::BaseClass* type) { + static_assert(std::is_base_of::value, "T must be derived from Base::BaseClass"); + if (type && type->isDerivedFrom(T::getClassTypeId())) { return static_cast(type); }