#include <iostream> #include <memory> #include <cmext/memory> namespace { class Base { public: virtual ~Base() = default; }; class Derived : public Base { public: ~Derived() = default; void method() {} }; template <typename T> class Wrapper { public: Wrapper(T* v) : value(v) { } ~Wrapper() { delete value; } T* get() const { return value; } private: T* value; }; bool testReferenceCast() { std::cout << "testReferenceCast()" << std::endl; std::unique_ptr<Base> u(new Derived); cm::static_reference_cast<Derived>(u).method(); cm::dynamic_reference_cast<Derived>(u).method(); std::shared_ptr<Base> s(new Derived); cm::static_reference_cast<Derived>(s).method(); cm::dynamic_reference_cast<Derived>(s).method(); // can also be used with custom wrappers Wrapper<Base> w(new Derived); cm::static_reference_cast<Derived>(w).method(); cm::dynamic_reference_cast<Derived>(w).method(); return true; } } int testCMExtMemory(int /*unused*/, char* /*unused*/ []) { if (!testReferenceCast()) { return 1; } return 0; }