以下のように、特定の型からすべてのポインターを再帰的に削除する単純な構造を持つことができます。
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<>
ポインタ型以外で宣言してもコンパイルエラーにはなりません。
これは、単一のポインターとポインター型なしの動作デモです。