У вас может быть простая конструкция, которая рекурсивно удаляет все указатели из данного типа, как показано ниже:
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 (const 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); }
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
};
В этом примере он удаляет все указатели из данного типа, но в соответствии с необходимостью вы можете настроить ActualType<>
и ActualValue<>
. Не будет никакой ошибки компилятора, даже если вы объявите MyPointer<>
с не указателем типа.
Вот рабочая демоверсия для одного указателя и без типов указателей.