#include #include #include namespace { class Base { public: virtual ~Base() = default; }; class Derived : public Base { public: ~Derived() = default; void method() {} }; template 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 u(new Derived); cm::static_reference_cast(u).method(); cm::dynamic_reference_cast(u).method(); std::shared_ptr s(new Derived); cm::static_reference_cast(s).method(); cm::dynamic_reference_cast(s).method(); // can also be used with custom wrappers Wrapper w(new Derived); cm::static_reference_cast(w).method(); cm::dynamic_reference_cast(w).method(); return true; } } int testCMExtMemory(int /*unused*/, char* /*unused*/ []) { if (!testReferenceCast()) { return 1; } return 0; }