テンプレートの特殊化が厄介な状況でこれを行う必要がある場合は、いくつかの適切なテンプレートで使用するタイプを計算することもできます。
template<class T> struct remove_all_pointers {
typedef T type;
};
template<class T> struct remove_all_pointers<T*> {
typedef typename remove_all_pointers<T>::type type;
};
template<class T> struct remove_all_pointers<T* const> {
typedef typename remove_all_pointers<T>::type type;
};
template<class T> struct remove_all_pointers<T* volatile> {
typedef typename remove_all_pointers<T>::type type;
};
template<class T> struct remove_all_pointers<T* const volatile> {
typedef typename remove_all_pointers<T>::type type;
};
struct Foo {
typedef int inner_type;
};
template<class T>
struct Bar {
typename remove_all_pointers<T>::type::inner_type x;
};