diff options
| -rw-r--r-- | include/crtp_tag.h | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/include/crtp_tag.h b/include/crtp_tag.h index 86f070e147..11c41cb5b3 100644 --- a/include/crtp_tag.h +++ b/include/crtp_tag.h @@ -48,6 +48,9 @@ namespace detail private: bool equals(const tag& rhs) const override final; + + Sub& sub_this() { return static_cast<Sub&>(*this); } + const Sub& sub_this() const { return static_cast<const Sub&>(*this); } }; template<class Sub> @@ -62,31 +65,31 @@ namespace detail template<class Sub> std::unique_ptr<tag> crtp_tag<Sub>::clone() const& { - return make_unique<Sub>(static_cast<const Sub&>(*this)); + return make_unique<Sub>(sub_this()); } template<class Sub> std::unique_ptr<tag> crtp_tag<Sub>::move_clone() && { - return make_unique<Sub>(static_cast<Sub&&>(*this)); + return make_unique<Sub>(std::move(sub_this())); } template<class Sub> tag& crtp_tag<Sub>::assign(tag&& rhs) { - return static_cast<Sub&>(*this) = dynamic_cast<Sub&&>(rhs); + return sub_this() = dynamic_cast<Sub&&>(rhs); } template<class Sub> void crtp_tag<Sub>::accept(tag_visitor& visitor) { - visitor.visit(static_cast<Sub&>(*this)); + visitor.visit(sub_this()); } template<class Sub> bool crtp_tag<Sub>::equals(const tag& rhs) const { - return static_cast<const Sub&>(*this) == static_cast<const Sub&>(rhs); + return sub_this() == static_cast<const Sub&>(rhs); } } |
