Listing 4: deep.h — The deep pointer template for "deeply const" pointers

// deep.h
     
#ifndef DEEP_H_INCLUDED
#define DEEP_H_INCLUDED
     
template <typename T>
class deep_pointer
    {
public:
    deep_pointer();
    deep_pointer(T *p);
    deep_pointer &operator=(T *p);
    operator T *();
    operator T const *() const;
    T *operator->();
    T const *operator->() const;
private:
    T *actual_pointer;
    };
     
...
     
#endif