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
}
dGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IEFjdHVhbFR5cGUgeyB0eXBlZGVmIFQgdHlwZTsgfTsKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IEFjdHVhbFR5cGU8VCo+IHsgdHlwZWRlZiB0eXBlbmFtZSBBY3R1YWxUeXBlPFQ+Ojp0eXBlIHR5cGU7IH07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp0eXBlbmFtZSBBY3R1YWxUeXBlPFQ+Ojp0eXBlIEFjdHVhbFZhbHVlIChUICZvYmopIHsgcmV0dXJuIG9iajsgfQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp0eXBlbmFtZSBBY3R1YWxUeXBlPFQ+Ojp0eXBlIEFjdHVhbFZhbHVlIChUICpwKSB7IHJldHVybiBBY3R1YWxWYWx1ZSgqcCk7IH0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBNeVBvaW50ZXIKewogICAgVCBwOwogICAgdHlwZW5hbWUgQWN0dWFsVHlwZTxUPjo6dHlwZSBvcGVyYXRvciAqKCkgeyByZXR1cm4gQWN0dWFsVmFsdWUocCk7IH0KfTsKCmludCBtYWluICgpCnsKICBNeVBvaW50ZXI8aW50Kj4gb2JqMTsgLy8gcG9pbnRlciBhcyB0ZW1wbGF0ZQogIGludCBpID0gKm9iajE7ICAvLyBkbyBkZXJlZmVyZW5jaW5nCiAgCiAgTXlQb2ludGVyPGludD4gb2JqMjsgLy8gc2ltcGxlIHR5cGUgYXMgdGVtcGxhdGUKICBpID0gKm9iajI7ICAvLyBkbyBkZXJlZmVyZW5jaW5nCn0K