| #include <iostream> | |
| #include <memory> | |
| #include <cmext/memory> | |
| namespace { | |
| class Base | |
| { | |
| public: | |
| virtual ~Base() = default; | |
| }; | |
| class Derived : public Base | |
| { | |
| public: | |
| ~Derived() override = default; | |
| void method() {} | |
| }; | |
| template <typename T> | |
| class Wrapper | |
| { | |
| public: | |
| Wrapper(T* v) | |
| : value(v) | |
| { | |
| } | |
| ~Wrapper() { delete this->value; } | |
| T* get() const { return this->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; | |
| } |