Listing 1: A class template for deeply-const pointers, with constructors, conversion operators, and -> operators

// deep.h

#ifndef DEEP_H_INCLUDED
#define DEEP_H_INCLUDED

template <typename T>
class deep_pointer
    {
public:
    deep_pointer();
    deep_pointer(T *p);
    operator T *&();
    operator T const *const &() const;
    T *operator->();
    T const *operator->() const;
private:
    T *actual_pointer;
    };

template <typename T>
inline
deep_pointer<T>::deep_pointer()
    {
    }

template <typename T>
inline
deep_pointer<T>::deep_pointer(T *p)
    : actual_pointer(p)
    {
    }

template <typename T>
inline
deep_pointer<T>::operator T *&()
    {
    return actual_pointer;
    }

template <typename T>
inline
deep_pointer<T>::operator T 
    const *const &() const
    {
    return actual_pointer;
    }

template <typename T>
inline
T *deep_pointer<T>::operator->()
    {
    return actual_pointer;
    }

template <typename T>
inline
T const *deep_pointer<T>::operator->() const
    {
    return actual_pointer;
    }

#endif