#include <memory>
// using std::unique_ptr, std::pointer_traits
template<class Pointer>
class FooBase
{
Pointer _m;
public:
using pointer = Pointer;
using element_type = typename std::pointer_traits<pointer>::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<Bar*>;
using OwningFoo = FooBase<std::unique_ptr<Bar> >;
Comments