#include // using std::unique_ptr, std::pointer_traits template class FooBase { Pointer _m; public: using pointer = Pointer; using element_type = typename std::pointer_traits::element_type; using reference = element_type&; using const_reference = const element_type&; explicit FooBase(reference ref) : _m(&ref) {} reference get() { return *_m; } const_reference get() const { return *_m; } }; class Bar; using Foo = FooBase; using OwningFoo = FooBase >;