#include <assert.h>class parent {public:template<class C>class operators {public: operators() { const parent* parent_this = dynamic_cast<parent*>(dynamic_cast<C*>(this)); // make sure this is derived from parent as well assert(parent_this); } virtual ~operators() { }; C operator-(){ C ret; ret.asdf = static_cast<parent*>(static_cast<C*>(this))->asdf * -1; return ret; }};public: int asdf; virtual ~parent() { };};class A : public parent, public parent::operators<A> { public: virtual ~A() { }; };class B : public parent::operators<A> { };