template<typename T>
struct ActualType { typedef T type; };
template<typename T>
struct ActualType<T*> { typedef typename ActualType<T>::type type; };

template<typename T>
typename ActualType<T>::type ActualValue (T &obj) { return obj; }
template<typename T>
typename ActualType<T>::type ActualValue (T *p) { return ActualValue(*p); }

template<typename T>
struct MyPointer
{
    T p;
    typename ActualType<T>::type operator *() { return ActualValue(p); }
};

int main ()
{
  MyPointer<int*> obj1; // pointer as template
  int i = *obj1;  // do dereferencing
  
  MyPointer<int> obj2; // simple type as template
  i = *obj2;  // do dereferencing
}
